我有两个代码拳头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'。
如何正确设置。
答案 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是原则。