【问题标题】:EF Code First 1:0..1 relationship error: Multiplicity is not valid in Role 'EFEmployee_Identity_Source' in relationship 'EFEmployee_Identity'EF Code First 1:0..1 关系错误:多重性在关系“EFEmployee_Identity”中的角色“EFEmployee_Identity_Source”中无效
【发布时间】:2015-06-24 20:55:05
【问题描述】:

完全错误:

在模型生成过程中检测到一个或多个验证错误:

EFEmployee_Identity_Source::多重性在关系“EFEmployee_Identity”中的角色“EFEmployee_Identity_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*'。

我正在处理三种类型的实体:EFEmployee、EFPerson 和 EFOffice。我收到这个错误有点奇怪,因为我正在测试的代码只创建了一个 EFOffice 实体的实例。无论如何,这里是 EFEmployee 实体类:

[Table("employee_entity")]
public class EFEmployee : EFBusinessEntity
{
    [ForeignKey("Office")]
    public Guid OfficeID { get; set; }

    [ForeignKey("Identity")]
    public Guid PersonID { get; set; }

    [Column("hire_date")]
    public DateTime HireDate { get; set; }

    [Column("job_title")]
    public byte[] JobTitle { get; set; }

    [Column("salary")]
    public int Salary { get; set; }

    [Column("certifications")]
    public byte[] Certifications { get; set; }

    [Column("vacation_time")]
    public int VacationTime { get; set; }

    [Column("sick_time")]
    public int SickTime { get; set; }

    public virtual EFOffice Office { get; set; }

    public EFPerson Identity { get; set; }

    public virtual EFEmployee ReportingTo { get; set; }
}

这是我的 EFPerson 实体类:

[Table("person_entity")]
public class EFPerson : EFBusinessEntity
{
    [Column("first_name")]
    [StringLength(50)]
    public string FirstName { get; set; }

    [Column("last_name")]
    [StringLength(50)]
    public string LastName { get; set; }

    [Column("phone_num")]
    public uint? PhoneNum { get; set; }

    [Column("date_of_birth")]
    public DateTime DateOfBirth { get; set; }

    public EFEmployee Employee { get; set; }
}

你可以看到它们都继承自 EFBusinessEntity,这里是:

[Table("business_entity")]
public abstract class EFBusinessEntity : IBusinessEntity
{
    [Column("tenant_id")]
    public Guid TenantId
    {
        get;
        set;
    }

    [Column("id")]
    [Key]
    public Guid Id
    {
        get;
        set;      
    }
}

如您所见,EFEmployee 和 EFPerson 之间存在一对零或一的关系,EFEmployee 是依赖方,因为可以有一个不是员工的人,但不能有一个不是人的员工。由于 EFEmployee 是依赖方,我在 EFEmployee 中添加了一个 PersonID,上面的数据注释(属性?)表示它是 Person 的外键:

[ForeignKey("Identity")]
public Guid PersonID { get; set; }

我想我已经对 Entity Framework 说得很清楚,这是一个 1:0..1 的关系。有谁知道如何解决这个错误使用数据注释(或属性,无论属性上面的方括号是什么)。由于我不了解的原因,我无法使用 fluent API。

【问题讨论】:

    标签: c# entity-framework foreign-keys data-annotations


    【解决方案1】:

    一般情况下,Entity Framework中1:0..1的关系,依赖方需要使用自己的主键作为外键。幸运的是,对于您的情况,这似乎不是一个坏主意。您需要:

    1. 删除EFEmployee.PersonID 属性
    2. [ForeignKey("Id")] 添加到EFEmployee.Identity

    编辑:可能不起作用,因为键和导航属性位于不同的类中。见this

    EFEmployee 继承自EFPerson 似乎也是一个可行的选择。继承默认使用 TPH,但如果您想使用 TPT(每个类型的表),请将 [Table] 属性添加到您的类型。

    【讨论】:

    • 嗯,既然我这样做了,我得到了我之前得到的错误:{“无法确定类型 'Models.EFPerson' 和 'Models.EFEmployee' 之间关联的主体端” . 必须使用关系流式 API 或数据注释显式配置此关联的主体端。”} 此外,EFEmployee 最好从 EFPerson 继承,但我需要所有实体类都从基实体类 EFBusinessEntity 继承。
    • 啊,开枪,我想你不能按照我最初的建议去做,因为导航属性和外键属性在不同的类上。 (参见this。另一方面,如果EFEmployee 继承自EFPerson,而EFPerson 继承自EFBusinessEntity,那是否意味着EFEmployee 仍继承自EFBusinessEntity
    • 谢谢,我去看看。哦对,呵呵,呵呵。但是我必须保持这样的实体模型,因为我正在与 NoSQL 数据库并行创建它,并且更容易拥有这样的关系。无论如何,总有一天我会拥有更多具有 1:0..1 关系的实体,并且继承不会像个人和员工那样起作用。
    • @Drew:嗯,带有“ForeignKey”注释的一侧应该标记依赖侧,但不确定在这种情况下您将如何使用它......对不起。通常,任何 1:1 关联的变体似乎都受到 Entity Framework 的限制——尤其是在您不能使用 Fluent API 的情况下。 (还没有看到有效的 optional:optional 关联。)手动加入(没有导航属性并在迁移中添加外键约束)或使用 1:* 关联(并验证多方最多有一个是另一种选择),但这些都是解决方法。
    • 别担心,感谢您的帮助!嗯,最后一个建议很有趣,但我更愿意坚持使用 SetInitializer 进行自动代码迁移(我希望我已经部分理解了你的建议)。这是因为我在运行时使用 CodeDOM 生成实体(这也是我想远离 fluent API 的原因,从那时起我也必须生成上下文,现在我可以使用反射来获取大会和其他东西。
    【解决方案2】:

    我又玩了一些模型,发现出了什么问题。所以我用 EFPerson.Identity 保留了外键属性,就像 jjj 建议的那样:

    [ForeignKey("PersonID")]
    public virtual EFPerson Identity { get; set; }
    

    然后我必须做出的另一个改变是在 EFPerson 类中。在我的 EFPerson 类中,我有 EFEmployee 的导航属性:

    public virtual EFEmployee Employee { get; set; }
    

    但是,由于这是一个 1:0..1 的关系,EFEmployee 是依赖方(即非必要方),所以我删除了该导航属性,并且当我运行测试时它起作用了。

    【讨论】:

    • 仅供参考,我认为这将使关系成为一对多。您也许可以将相同的EFPerson 分配给多个EFEmployeeIdentity
    • 嗯,我想知道在保持模型这样的同时,是否还有其他约束条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多