在 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.
删除掉列表项数据的简易办法是什么?
ef中我记得好像有个啥设置级联删除吧。
当我类似下面伪代码调用时
var person = ef.find(1)
person.Addresses.RemoveAt(0)
ef.savechange()
如果是 Person 和 Addresses 的关系是 Optional,删除后,Addresses 表相应记录会设置成 null;如果是 Required,删除时,则报不能为 null 的异常。
稍候我给出正式的代码来。