实体框架 - 更新对象时更新列表
本文关键字:更新 列表 对象 实体 框架 | 更新日期: 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; }
}
使用实体框架代码优先,这将生成一个包含Business
和Delivery
对象的外键的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()
)。