EF6“代码优先”外键多重性在角色中无效

本文关键字:多重性 角色 无效 代码 代码优先 EF6 | 更新日期: 2023-09-27 18:07:03

我对EF有点陌生。我的情况不可能那么独特,但我一直找不到一个好的答案。

我有三张表。前两个是CompanyClientClient有一个CompanyId外键返回到其客户所在的公司。CompanyClientAddress表都有一个AddressId外键。

我已经消除了通过地址表的级联删除以消除循环级联。现在,当我尝试生成数据库时,我得到:

关系'Client_Address'中角色'Client_Address_Source'的多重性无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上界必须是'*'。

在Company表上也得到相同的错误。以下是我的实体(代码缩写为post):

namespace ForeignKeyExample.DataModel
{
    [Table("Address")]
    public class Address
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int AddressId { get; set; }
        public int AddressTypeId { get; set; }
        public string Address1 { get; set; }
        public string Address2 { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
    }
}
namespace ForeignKeyExample.DataModel
{
    [Table("Company")]
    public class Company
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CompanyId { get; set; }
        public string Name { get; set; }
        public int? AddressId { get; set; }
        [ForeignKey("AddressId")]
        public Address Address { get; set; }
    }
}
namespace ForeignKeyExample.DataModel
{
    [Table("Client")]
    public class Client
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ClientId { get; set; }
        public string Name { get; set; }
        public int? AddressId { get; set; }
        public int CompanyId { get; set; }
        [ForeignKey("AddressId")]
        public Address Address { get; set; }
        [ForeignKey("CompanyId")]
        public Company Company { get; set; }
    }
}
namespace ForeignKeyExample
{
    public class ExampleContext : DbContext
    {
        public ExampleContext() : base("name=ExampleContext"){  this.Configuration.ProxyCreationEnabled = false; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Client>().HasOptional(a => a.Address).WithOptionalDependent().WillCascadeOnDelete(false);
            modelBuilder.Entity<Company>().HasOptional(a => a.Address).WithOptionalDependent().WillCascadeOnDelete(false);
        }
        public DbSet<Address> Addresses { get; set; }
        public DbSet<Company> Companies { get; set; }
        public DbSet<Client> Clients { get; set; }
    }
}

也许有一些方法可以"流利地"解决OnModelCreating中的问题?这个错误让我相信(我在其他帖子中也看到过)EF想让我翻转引用,让地址表指向公司或客户,但这意味着我需要两个地址表,这似乎很蹩脚。谢谢你的帮助。

布兰登

谢谢

*编辑
根据评论的要求,我在上面的类中添加了更多的细节。这三个模型类位于主项目下的子文件夹model中。项目中已安装EF6。如前所述,OnModelCreating中的两行代码用于删除关系中的循环引用,并在删除可选的Address项时删除级联。在运行enable-migrations之后,我收到了上面列出的错误。希望这能让它重现。感谢大家的评论

EF6“代码优先”外键多重性在角色中无效

只是想分享这个问题的积极解决方案-即使它在这种情况下不相关-这适用于VS2012:

1)选择项目的.edmx文件。这-希望-带来了数据库/表和"模型浏览器"的关系图,MB。

2)以MB为单位打开"associations",然后点击fk_definition的相关性。

3)在"属性"中查看"End1多重性"answers"End2多重性",并将它们适当地更改为例如。"0…1(0或1 of Task)'.

在我的例子中,我在定义表并随后更改时忘记将字段定义为'Nullable'。因此,在我的mvc项目中遇到问题,该项目在基础更改时不会自行重新配置。纠正这是一个挑战,这个修复是最后要改变的。-)

到目前为止,我只是MVC的初学者…

只需注释掉OnModelCreating中的两行即可修复错误。生成ED迁移并查看生成的表,我认为它们是您想要的外键:

        CreateTable(
            "dbo.Address",
            c => new
                {
                    AddressId = c.Int(nullable: false, identity: true),
                    AddressTypeId = c.Int(nullable: false),
                    Address1 = c.String(),
                    Address2 = c.String(),
                    City = c.String(),
                    State = c.String(),
                    PostalCode = c.String(),
                })
            .PrimaryKey(t => t.AddressId);
        CreateTable(
            "dbo.Client",
            c => new
                {
                    ClientId = c.Int(nullable: false, identity: true),
                    Name = c.String(),
                    AddressId = c.Int(),
                    CompanyId = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.ClientId)
            .ForeignKey("dbo.Address", t => t.AddressId)
            .ForeignKey("dbo.Company", t => t.CompanyId, cascadeDelete: true)
            .Index(t => t.AddressId)
            .Index(t => t.CompanyId);
        CreateTable(
            "dbo.Company",
            c => new
                {
                    CompanyId = c.Int(nullable: false, identity: true),
                    Name = c.String(),
                    AddressId = c.Int(),
                })
            .PrimaryKey(t => t.CompanyId)
            .ForeignKey("dbo.Address", t => t.AddressId)
            .Index(t => t.AddressId);

关于级联删除,如果外键为空,则Code First不会在关系上设置级联删除,当主体被删除时,外键将被设置为空。因此,如果您在这里不执行显式映射,则级联删除将设置为false。