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

我有三张桌子。前两个是CompanyClientClient有一个CompanyId外键,返回给其客户所在的公司。 CompanyClient都具有AddressId表的Address外键。

我已经通过地址表消除了级联删除,从而消除了环形层叠。现在,当我尝试生成数据库时,我得到:


  多重性在关系“ 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希望我翻转引用并将“地址”表引用回“公司”或“客户”,但这意味着我需要两个地址表,这似乎好吧,la子任何帮助表示赞赏。

谢谢布兰登

*编辑
根据评论的要求,我在上面的类中添加了更多详细信息。这三个模型类位于主项目下的子文件夹Model中。 EF6已安装在项目上。如前所述,OnModelCreating中的两行内容是删除关系中的循环引用,如果删除了可选的Address项,则删除级联。运行enable-migrations之后,我收到上面列出的错误。希望这将使其具有可复制性。感谢您发表评论。

最佳答案

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

1)选择项目的.edmx。希望这会显示一个日期数据库/表和“模型浏览器”(MB)的图表。

2)在MB中,打开“关联”,然后单击相关性的FK_定义。

3)在“属性”中,查看“ End1多重性”和“ End2多重性”,并将它们适当地更改为例如“ 0 ... 1(零或任务之一)”。

就我而言,我忘记了在定义表时将字段定义为“可空”,并随后对其进行了更改。因此,在我的MVC项目中遇到了问题,当基础发生变化时,该问题不会自行重新配置。更正这是一个挑战,而此修复程序是最后要做的更改。-)

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

关于c# - EF6代码优先“外键多重性在角色中无效”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24090179/

10-09 06:50