c# - EF6 代码优先 "Foreign Key Multiplicity is not valid in Role"

标签 c# entity-framework ef-code-first entity-framework-6

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

我有三个表。前两个是 CompanyClientClient 有一个 CompanyId 外键返回到他们是其客户的公司。 CompanyClient 都有一个指向Address 表的AddressId 外键。

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

Multiplicity is not valid in Role 'Client_Address_Source' in relationship 'Client_Address'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

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

谢谢
布兰登

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

最佳答案

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

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

2) 在 MB 中打开“关联”并单击 FK_-相关性定义。

3) 在“属性”中查看“End1 Multiplicity”和“End2 Multiplicity”并将它们适本地更改为例如'0...1(零个或一个任务)'。

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

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

关于c# - EF6 代码优先 "Foreign Key Multiplicity is not valid in Role",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24090179/

相关文章:

c# - 垃圾收集和 GCHandle.Alloc

c# - 为什么TimeSpan和Guid Structs可以比作null?

c# - 基于子项或父项的树结构

entity-framework - Entity Framework 是否支持删除记录并将外键设置为空?

c# - IE7文件下载对话框消失

c# - 复杂 PK 的通用 GetById

asp.net-mvc - 换行问题 - C# .NET MVC

c# - 使用 AutoMapper 映射后,上下文未更新加载的实体

entity-framework - 有没有简单的方法来生成 Entity Framework 代码优先类?

c# - EF + 通用存储库 + 加载相关实体 : only explicit load works