Asp.net mvc 4 同一实体类型代码的多个一对多关系

Asp.net mvc 4 同一实体类型代码的多个一对多关系,asp.net-mvc-4,ef-code-first,entity-framework-5,code-first,Asp.net Mvc 4,Ef Code First,Entity Framework 5,Code First,我在定义具有两个一对多关系(两个列表)的实体时遇到问题 公共类日历 { [关键] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 公共Guid ID{get;set;} 公共虚拟IList空闲区{get;set;} 公共虚拟IList指定列表{get;set;} ... } 公开课任命 { [关键] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity

我在定义具有两个一对多关系(两个列表)的实体时遇到问题

公共类日历
{
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
公共Guid ID{get;set;}
公共虚拟IList空闲区{get;set;}
公共虚拟IList指定列表{get;set;}
...
}
公开课任命
{
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
公共指定ID{get;set;}
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共字符串类型{get;set;}
公共字符串信息{get;set;}
公共Guid CalendarID{get;set;}
公共虚拟日历{get;set;}
}
和代码第一个代码:

modelBuilder.Entity<Appointment>().HasKey(u => new {u.AppointmentID, u.CalendarID });
        modelBuilder.Entity<Appointment>().HasRequired(u => u.Calendar).WithMany(c => c.FreeSlots).HasForeignKey(f => f.CalendarID).WillCascadeOnDelete(true);
        modelBuilder.Entity<Appointment>().HasRequired(u => u.Calendar).WithMany(c => c.AppointmentsList).HasForeignKey(f => f.CalendarID).WillCascadeOnDelete(true);
modelBuilder.Entity().HasKey(u=>new{u.AppointmentID,u.CalendarID});
modelBuilder.Entity().HasRequired(u=>u.Calendar)。WithMany(c=>c.FreeSlots)。HasForeignKey(f=>f.CalendarID)。WillCascadeOnDelete(true);
modelBuilder.Entity().HasRequired(u=>u.Calendar)。WithMany(c=>c.AppointsList)。HasForeignKey(f=>f.CalendarID)。WillCascadeOnDelete(true);
约会有两个主键,因为如果日历被删除,我希望约会被删除

当我尝试将新约会添加到FreeSlot时,会出现以下错误: 保存未公开其关系的外键属性的实体时出错。EntityEntries属性将返回null,因为无法将单个实体标识为异常源

我也尝试过这种映射,但没有成功:错误0040:Type Calendar\u FreeSlots未在名称空间Project.DAL(Alias=Self)中定义

modelBuilder.Entity().HasKey(u=>new{u.AppointmentID,u.CalendarID});
modelBuilder.Entity().HasMany(c=>c.FreeSlots)。WithRequired(c=>c.Calendar)。HasForeignKey(c=>c.CalendarID)。WillCascadeOnDelete();
modelBuilder.Entity().HasMany(c=>c.AppointmentsList).WithRequired(c=>c.Calendar).HasForeignKey(c=>c.CalendarID.WillCascadeOnDelete();

我想问题在于,我对同一类型的实体有两个一对多的关系,但我不知道如何正确地进行映射。

映射中的错误是,您对两个不同的关系使用了两次
约会.日历。那是不可能的。在
约会
中需要第二对FK和导航属性(或映射一个不带反向属性的关系):

modelBuilder.Entity()
.HasMany(c=>c.FreeSlots)
.WithRequired(c=>c.Calendar1)
.HasForeignKey(c=>c.Calendar1ID)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.HasMany(c=>c.AppointmentsList)
.WithRequired(c=>c.Calendar2)
.HasForeignKey(c=>c.Calendar2ID)
.WillCascadeOnDelete(真);
(对于至少一个关系,必须禁用级联删除。否则,最终将出现多个级联删除异常。)


然而,我觉得你实际上应该只有一个关系和集合
日历。约会
,以及
约会
中的一种状态,就像
bool IsFree
属性一样。然后,您可以使用
calendar.appoints.Where(a=>a.IsFree)

谢谢@Slauma!这解决了我的问题。关于bool属性,你是对的,事实上,我使用了两个从约会继承的不同实体。无论如何,我不明白映射的问题是什么,但现在我明白了:)我正在尝试做类似的事情。我有一个有电子邮件和电话的联系人。我想将电子邮件和电话合并到一个名为CONTACTINFO的实体中,该实体可以具有ContactInfoType属性(Enum)来区分它们。是否有办法在modelbuilder中使用带有默认WHERE子句/条件的导航属性?
modelBuilder.Entity<Appointment>().HasKey(u => new {u.AppointmentID, u.CalendarID });
        modelBuilder.Entity<Appointment>().HasRequired(u => u.Calendar).WithMany(c => c.FreeSlots).HasForeignKey(f => f.CalendarID).WillCascadeOnDelete(true);
        modelBuilder.Entity<Appointment>().HasRequired(u => u.Calendar).WithMany(c => c.AppointmentsList).HasForeignKey(f => f.CalendarID).WillCascadeOnDelete(true);
modelBuilder.Entity<Appointment>().HasKey(u => new {u.AppointmentID, u.CalendarID });           
        modelBuilder.Entity<Calendar>().HasMany(c => c.FreeSlots).WithRequired(c => c.Calendar).HasForeignKey(c => c.CalendarID).WillCascadeOnDelete();
        modelBuilder.Entity<Calendar>().HasMany(c => c.AppointmentsList).WithRequired(c => c.Calendar).HasForeignKey(c => c.CalendarID).WillCascadeOnDelete();
modelBuilder.Entity<Calendar>()
    .HasMany(c => c.FreeSlots)
    .WithRequired(c => c.Calendar1)
    .HasForeignKey(c => c.Calendar1ID)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Calendar>()
    .HasMany(c => c.AppointmentsList)
    .WithRequired(c => c.Calendar2)
    .HasForeignKey(c => c.Calendar2ID)
    .WillCascadeOnDelete(true);