2017-09-25 37 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連接。