首页 新闻 会员 周边

在 EF 中,如何干净的删除列表子项

0
[待解决问题]

在 EF 里,如果有个 Model 有个列表对象,例如:
class Person
{
public Guid Id {get;set;}
public virtual List<Address> Addresses {get;set;}
}
出现这种一对多的关系,我会有子项只能添加,不能删除的问题:
如果是 Optional,删除后,则留下 null 记录;如果是 Required,删除时,则报不能为 null 的异常。

问题补充:

代码如下

public class Order
{
  public Guid Id { get; set; }
  public virtual List<OrderItem> Items { get; set; }
}

public class OrderItem
{
  public Guid Id { get; set; }
  public string Name { get; set; }
}

class Mapping : DbContext
{
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();

    modelBuilder.Entity<Domain.Order>().Property(m => m.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
    modelBuilder.Entity<Domain.Order>().HasMany(m => m.Items).WithOptional();

    modelBuilder.Entity<Domain.OrderItem>().Property(m => m.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
  }
}

static void Main(string[] args)
{
  var ef = new Repositories.Mapping();
  var order = new Domain.Order();
  order.Items = new List<Domain.OrderItem>();
  order.Items.Add(new Domain.OrderItem { Name = "hello" });
  order.Items.Add(new Domain.OrderItem { Name = "world" });
  ef.Set<Domain.Order>().Add(order);
  ef.SaveChanges();

  order.Items.RemoveAt(0);
  ef.SaveChanges();
}

当 Mapping 定义是这样时

modelBuilder.Entity<Domain.Order>().HasMany(m => m.Items).WithOptional();

OrderItem 的内空如下所示,Order_Id 被设置为空,记录还在。
Id Name Order_Id
xx hello NULL
xx world xx

而定义改成

modelBuilder.Entity<Domain.Order>().HasMany(m => m.Items).WithRequired();

则产生如下异常。
A relationship from the 'Order_Items' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Order_Items_Target' must also in the 'Deleted' state.

删除掉列表项数据的简易办法是什么?

奥德曼的主页 奥德曼 | 菜鸟二级 | 园豆:202
提问于:2016-10-25 15:43
< >
分享
所有回答(1)
0

ef中我记得好像有个啥设置级联删除吧。

Daniel Cai | 园豆:10424 (专家六级) | 2016-10-25 16:15

当我类似下面伪代码调用时

var person = ef.find(1)

person.Addresses.RemoveAt(0)

ef.savechange()

如果是 Person 和 Addresses 的关系是 Optional,删除后,Addresses 表相应记录会设置成 null;如果是 Required,删除时,则报不能为 null 的异常。

稍候我给出正式的代码来。

支持(0) 反对(0) 奥德曼 | 园豆:202 (菜鸟二级) | 2016-10-25 16:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册