2017-09-25 63 views
0

我有以下两类:SQLite的EF6梯级上的许多删除对许多

[Table("Products")] 
public class Product 
{ 
    public int Id { get; set; } 
    public string Code { get; set; } 
    public string Name { get; set; } 


    public virtual ICollection<Process> Processes { get; set; } 

    public Product() 
    { 
     this.Processes = new HashSet<Process>(); 
    } 
} 

[Table("Processes")] 
public class Process 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string MachineName { get; set; } 


    //list of all products 
    public virtual ICollection<Product> Products { get; set; } 
    public Process() 
    { 
     this.Products = new HashSet<Product>(); 
    } 
} 

正如你所看到的,一个产品可以有多个进程,一个进程可以绑定到多种产品。 (如产品主席包括以下过程:切割钻孔,等...

在我OnModelCreating方法在我DataContext我指定了多对多的关系如下:

 modelBuilder.Entity<Process>() 
      .HasMany<Product>(s => s.Products) 
      .WithMany(c => c.Processes) 
      .Map(cs => 
      { 
       cs.MapLeftKey("Process_ProcessId"); 
       cs.MapRightKey("Product_ProductId"); 
       cs.ToTable("ProcessProducts"); 
      }); 

它创建了一个名为ProcessProducts新表,其中多对多的关系被存储。

现在我的问题是,当我删除例如从我的数据库产品中,我想自动删除ProcessProducts表中的所有行,其中使用了特定的ProductId。我想在我的模型构建器下配置CascadeDelete,但它不允许我这样做。

也许这是我的方式,我如何删除该项目是错误的?

public void Delete(TEntity entity) 
    { 
     if (entity == null) throw new ArgumentNullException("entity"); 
     _context.Set<TEntity>().Attach(entity); 
     _context.Set<TEntity>().Remove(entity); 
     _context.SaveChanges(); 
    } 

任何有关此事的帮助将不胜感激。

回答

1

在级联模式下删除可以使用SQLEF

每种情况都需要配置级联的深度。所以,问题是:你有多深想去的地方:

如果删除Product应该去删除它,如果这Process(es)连接Process(es)有其他Product(s)应该级联保持这条产业链的缺失?

也许通过级联删除,您只能删除ProductProcess之间的连接(多对多关系)。如果是这样的话,你只需要做:

public void DeleteProduct(Product entity) 
{ 
    if (entity == null) throw new ArgumentNullException("entity"); 
    entity = _context.Set<Product>().First(f => f.Id == entity.Id); 
    _context.Set<Product>().Remove(entity); 
    _context.SaveChanges(); 
} 

这应该删除您Product和所有ProcessProducts登记您的Product连接。