SQLite EF6级联删除多对多

时间:2017-09-25 18:11:53

标签: c# database sqlite entity-framework-6

我有以下两个类:

[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的{​​{1}}方法下,我指定了多对多关系,如下所示:

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。我想在我的modelBuilder下配置ProductId,但它不允许我这样做。

也许就是这样,我如何删除错误的项目?

CascadeDelete

对此事项的任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

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

每个案例都需要配置级联的深度。所以问题是:你想要多深:

如果您删除Product,则应删除与其关联的de 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注册管理机构。