首先使用流畅的API在EF代码中定义一对一

时间:2015-02-09 23:49:57

标签: c# entity-framework

我有两个代码拳头POCO(Appointee和Case):

public class Appointee
{
    public int ID { get; set; }
    public string ProfileID { get; set; }
    public int? CaseID { get; set; }
    public string FistName { get; set; }
    public string LastName { get; set; }
    public DateTime Dob { get; set; }
    public string Ssn { get; set; }
    public string GrantNumber { get; set; }

    public virtual Case Case { get; set; }
} 

public class Case
{
    [Key]
    public int CaseID { get; set; }
    public string ProfileID { get; set; }
    public int PSCStatusID { get; set; }

    public virtual Appointee Appointee { get; set; }
}  

在我们的术语中,Appointee是Profile的同义词。所以我们的被任命者的[Key]是ProfileID。

被任命者不必分配案例,因此我将CaseID设置为nullable int - int?。

由此我得到错误,例如,在案例和被任命者之间无法确定EndPoint。

我认为问题出在案例中。 作为Appointee的外键的ProfileID应该是Virtual Appointee属性的导航属性。 但我不认为它理解导航道具不是AppointeeID而是ProfileID。

所以我把它放在DbContext中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Appointee>().HasKey(a => a.ProfileID);
        modelBuilder.Entity<Case>().HasKey(c => c.CaseID);
        modelBuilder.Entity<Case>().HasRequired(c => c.Appointee);
        modelBuilder.Entity<Appointee>().HasOptional(a => a.Case);
    }

现在我得到:无效的列名'Appointee_ProfileID'。

如何正确设置。

1 个答案:

答案 0 :(得分:1)

终于解决了这个问题。 这里有几件事。 我已经习惯使用AutoInc设置代理主键,我为Appointee和Case设置了autoinc ID。

真的,被任命者的关键应该是ProfileID。

接下来,在Entity Framework中,从属表中的外键必须与父表中的主键相同,EF称为原则。

因此,一旦我知道我的密钥是PK和FK,我必须是ProfileID,我做了以下修复。

public class Appointee
{
    [Key]
    public string ProfileID { get; set; }
    public string FistName { get; set; }
    public string LastName { get; set; }
    public DateTime Dob { get; set; }
    public string Ssn { get; set; }
    public string GrantNumber { get; set; }

    public virtual Case Case { get; set; }
}

public class Case
{
    [Key, ForeignKey("Appointee")]
    public string ProfileID { get; set; }
    public int PSCStatusID { get; set; }

    [ForeignKey("ProfileID")]
    public virtual Appointee Appointee { get; set; }
}

注意Case上的[Key,ForeignKey(“Appointee”)]属性,我需要告诉EF,Appointee是原则。