可选的导航属性:可选,其中只有一个表具有外键

时间:2012-10-05 11:36:55

标签: .net entity-framework entity-framework-5

我正在尝试定义以下模型,其中约会表具有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)。

1 个答案:

答案 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属性,因此您无法在查询中使用它。