假设我有一个独立包中的类,可以被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
表包含Business
和Delivery
个对象的外键。
假设我修改了一个Business
对象(清除OpeningHours
的列表并在代码中添加新的对象)并更新它;更新后,旧的TimeSlot
记录将BusinessId
外键设置为NULL而不是被删除。
删除这些记录的正确实现是什么,因为它们不再需要(并且最好不会污染TimeSlot
对象)?
答案 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()
。)