2014-12-24 98 views
0

时更新名单假设我有一类就是在一个独立的包,并可能由多个对象使用,例如:实体框架 - 更新对象

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

使用实体框架代码优先,这将[R在包含BusinessDelivery对象的外键的TimeSlot表中引用。

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

回答

0

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

所以你必须明确地删除子项:

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

RemoveRange是EF 6,伴你走过business.OpeningHours必须循环做db.TimeSlots.Remove()更早版本)。

+0

谢谢!它的工作:) – zahikaram

2

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

你好,谢谢你的回答。但是,这不起作用。我找不到WithMany;我发现了HasMany,并试图使用它,但不能在链式调用中调用WillCascadeOnDelete。 – zahikaram

+0

请立即检查。我更新了答案。希望这次它能工作。 – Sarbanjeet

+0

现在我得到:无法投射'System.Collections.Generic.List'1 [ZMvcHelpers.Models.Time.TimeSlot]'类型的对象来键入'ZMvcHelpers.Models.Time.TimeSlot'。 – zahikaram