我正在尝试定义以下模型,其中约会表具有Person的外键,并且实体都具有彼此的导航属性。
public class Appointment
{
public int AppointmentId { get; set; }
// Foreign Key property (this will be created in DB)
public int? PersonId { get; set; }
// Navigation property to Flatmate
public virtual Person Person { get; set; }
}
public class Person
{
public int PersonId { get; set; }
// Just navigation property. Don't want Person table to include foreign key (no need)
public virtual Appointment Appointment { get; set; }
}
我尝试使用流畅的配置:
modelBuilder.Entity<Appointment>()
.HasOptional(a => a.Person)
.WithOptionalDependent(p=> p.Appointment);
但我得到一个例外,它缺少一个列(Appointment_AppointmentId或Person_PersonId,取决于我是使用WithOptionalDependent还是WithOptionalPrincipal)。
答案 0 :(得分:1)
实体框架不支持此功能。 HasOptional().WithOptionalDependent()
可以在两个表使用相同的密钥(PersonId == AppointmentId
)时工作,但这不是您的情况。为了确保一个人没有多个约会,您需要确保PersonId
表中Appointment
是唯一的,并且实体框架不支持唯一约束。
你可以做什么(不改变你的数据库)将它映射为一对多关系,其中一个人可以有多个约会,并创建一个帮助属性来返回一个约会:
public virtual ICollection<Appointments> Appointments { get; set; }
[NotMapped]
public Appointment Appointment {
get {
return Appointments.SingleOrDefault();
}
}
请注意,Entity Framework无法理解Appointment
属性,因此您无法在查询中使用它。