实体的导航属性未加载

时间:2011-10-22 05:02:25

标签: entity-framework-4 linq-to-entities

我正在建立一个预订系统。我有角色的用户('admin','client','employee','student')。

每个预订必须与角色客户的用户相关联,可能会分配给角色员工的用户,也可能会分配给角色学生的用户。

所以在我的预订类中,我有User类型的属性,我用[ForeignKey(“AnytypeId”)]属性标记它们,以提示关系的EF。

我在http://blog.stevensanderson.com/2011/01/28/mvcscaffolding-one-to-many-relationships/

看到过这样的代码
public class Reservation
{

    public int ReservationID
    {
        get;
        set;
    }

    [Required(ErrorMessage="Please provide a valid date")]
    public DateTime ReservationDate
    {
        get;
        set;
    }
    public DateTime ReservationEnd { get; set; }
    public DateTime EntryDate
    {
        get;
        set;
    }
    public DateTime UpdatedOn
    {
        get;
        set;
    }
    public decimal Ammount
    {
        get;
        set;
    }

    public decimal? Discount { get; set; }

    [DataType(DataType.MultilineText)]
    public string ServiceDetails { get; set; }

    [DataType(DataType.MultilineText)]        
    public string Remarks { get; set; }

    public String  PaymentMethod { get; set; }
    public string VoucherNumber { get; set; }

    public int ServiceID
    {
        get;
        set;
    }
    public virtual Service Service
    {
        get;
        set;
    }


    public string EmployeeID { get; set; }
    [ForeignKey("EmployeeID")]
    public virtual User Employee { get; set; }


    public string ClientID { get; set; }
    [ForeignKey("ClientID")]
    public virtual User Client { get; set; }


    public string StudentID { get; set; }
    [ForeignKey("StudentID")]
    public virtual User Student { get; set; }


}

public class ReservationMap : EntityTypeConfiguration<Reservation>
{
    public ReservationMap()
    {
        this.HasOptional(r => r.Client).WithMany().WillCascadeOnDelete(true);
        this.HasOptional(r => r.Employee).WithMany().WillCascadeOnDelete(false);
        this.HasOptional(r=>r.Student).WithMany().WillCascadeOnDelete(false);
    }
}

现在,当我运行我的mvc3 EF代码时,第一个为我创建的应用程序数据库,其中包含以下ERD和edmx模型。 enter image description here

现在我遇到的问题很少:  1.当我列出角色客户端的所有用户时,即使他们在数据库中有预订,他们的预订属性也始终显示为0。我不知道为什么用virtual标记的这个集合属性没有加载??

请我坚持这个帮助我,这是剩下的最后一件事。

1 个答案:

答案 0 :(得分:0)

您的模型中存在几个问题。您已经配置了一对多关系,以便从映射中排除多个结束(Reservations属性)。因此,EF不会加载Reservations

另一个问题是,如果要将Reservations属性映射为关系的多端,那么导航属性是什么?它是EmployeeClientStudent?因为只有其中一个属性可以参与与Reservations属性的关系。

目前尚不清楚这些关系应如何根据您的描述建模。一种方法是拥有3个集合属性。

public class ReservationMap : EntityTypeConfiguration<Reservation>
{
    public ReservationMap()
    {
        HasOptional(r => r.Client).WithMany(u => u.ClientReservations).WillCascadeOnDelete(true);
        HasOptional(r => r.Employee).WithMany(u => u.EmployeeReservations).WillCascadeOnDelete(false);
        HasOptional(r=>r.Student).WithMany(u => u.StudentReservations).WillCascadeOnDelete(false);
    }
}