C# 实体框架-更新对象时更新列表

C# 实体框架-更新对象时更新列表,c#,asp.net,entity-framework,ef-code-first,code-first,C#,Asp.net,Entity Framework,Ef Code First,Code First,假设我有一个独立包中的类,可以由多个对象使用,例如: public class TimeSlot { [Required] public int Id { get; set; } [Required] public DateTime StartTime { get; set; } [Required] public DateTime EndTime { get; set; } } 并非此时间段可以从以下两个类中引用: public cla

假设我有一个独立包中的类,可以由多个对象使用,例如:

public class TimeSlot 
{
    [Required]
    public int Id { get; set; }

    [Required]
    public DateTime StartTime { get; set; }

    [Required]
    public DateTime EndTime { get; set; }
} 
并非此时间段可以从以下两个类中引用:

public class Business
{
    public int Id { get; set; }

    public virtual IList<TimeSlot> OpeningHours { get; set; }
}
公共类业务
{
公共int Id{get;set;}
公共虚拟IList OpeningHours{get;set;}
}

公共类交付
{
公共int Id{get;set;}
公共虚拟IList交付小时数{get;set;}
}
首先使用实体框架代码,这将生成一个
时隙
表,其中包含
业务
交付
对象的外键

假设我修改了一个
Business
对象(清除
OpeningHours
列表并在代码中添加新的对象)并对其进行更新;更新后,旧的
时隙
记录的
BusinessId
外键将设置为NULL,而不是被删除。
由于不再需要这些记录(并且最好不污染
时隙
对象),删除这些记录的正确实现是什么?

在DbContext类中的OnModelCreating中进行更改。将willCascadeOnDelete添加到true

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

     modelBuilder.Entity<Business>()
      .HasOptional(a => a.OpeningHours)
      .WithOptionalDependent()
      .WillCascadeOnDelete(true);

    base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Entity()
.has可选(a=>a.OpeningHours)
.WithOptionalDependent()
.WillCascadeOnDelete(真);
基于模型创建(modelBuilder);
}

使用EF删除子集合元素非常复杂。当您清除集合或从集合中删除项目时,EF将起到安全的作用,并且不会假定您要删除对象,而只想断开关联

因此,必须明确删除子项:

db.TimeSlots.RemoveRange(business.OpeningHours);
db.SaveChanges();

RemoveRange
是EF 6,在早期版本中,您必须循环使用
business.OpeningHours
并执行
db.TimeSlots.Remove()
)。

您好,谢谢您的回答。然而,这是行不通的。我找不到多少;我找到了HasMany,并尝试使用它,但在链接调用中无法调用WillCascadeOnDelete。请立即检查。我更新了答案。希望这次能成功。现在我得到:无法将类型为“System.Collections.Generic.List`1[ZMVHelpers.Models.time.TimeSlot]”的对象强制转换为类型为“ZMVHelpers.Models.time.TimeSlot”。很抱歉,它仍然无法工作。。。我在更新数据库时向您显示了错误消息。您的解决方案无法解决此问题:('modelBuilder.Entity().HasOptional(e=>e.OpeningHours)。WithOptionalPrincipal().WillCascadeOnDelete(true);'@zahikaram
db.TimeSlots.RemoveRange(business.OpeningHours);
db.SaveChanges();