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

时间:2014-12-24 12:48:53

标签: c# asp.net entity-framework ef-code-first code-first

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

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

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

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

不是这个TimeSlot可以从以下两个类引用:

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

首先使用Entity Framework代码,这将导致TimeSlot表包含BusinessDelivery个对象的外键。

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

2 个答案:

答案 0 :(得分:2)

更改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);
}

答案 1 :(得分:0)

使用EF,删除子集合元素非常精细。清除集合或从中删除项目时,EF可以安全地播放,并且不会假设您要删除对象,但只想破坏关联。

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

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

RemoveRange是EF 6,早期版本必须循环浏览business.OpeningHours并执行db.TimeSlots.Remove()。)