我正在建立一个预订系统。我有角色的用户('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模型。
现在我遇到的问题很少: 1.当我列出角色客户端的所有用户时,即使他们在数据库中有预订,他们的预订属性也始终显示为0。我不知道为什么用virtual标记的这个集合属性没有加载??
请我坚持这个帮助我,这是剩下的最后一件事。
答案 0 :(得分:0)
您的模型中存在几个问题。您已经配置了一对多关系,以便从映射中排除多个结束(Reservations
属性)。因此,EF不会加载Reservations
。
另一个问题是,如果要将Reservations
属性映射为关系的多端,那么导航属性是什么?它是Employee
,Client
,Student
?因为只有其中一个属性可以参与与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);
}
}