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

本文关键字:更新 列表 对象 实体 框架 | 更新日期: 2023-09-27 18:35:08

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

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; }
}

public class Delivery
{
    public int Id { get; set; }
    public virtual IList<TimeSlot> DeliveryHours { get; set; }
}

使用实体框架代码优先,这将生成一个包含BusinessDelivery对象的外键的TimeSlot表。

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

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

在 DbContext 类中创建 OnModelCreation 中的更改。 将 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);
}

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

因此,您必须显式删除子项:

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

RemoveRange是EF 6,对于早期版本,您必须遍历business.OpeningHours并执行db.TimeSlots.Remove())。