C#在EntityFramework中删除多个集合的最佳方法

时间:2016-10-06 11:00:43

标签: entity-framework c#-4.0

我有以下具有一对多关系的类

public class Category
{
    public Category()
    {
        this.Products = new List<Product>();
    }
    public int Id {get;set;}
    public string Name {get;set;}
    public ICollection<Product> Products {get;set;}
}

public class Product
{
    public int Id {get;set;}
    public string Name {get;set;}
    public int CategoryId {get;set;}
    public Category Category {get;set;}
}

My datacontext is as shown below:

public class MyContext : DbContext
{
    public virtual IDbSet<Category> Categories { get; set; }
    public virtual IDbSet<Product> Products { get; set; }
}

我想用一个新的类别集合替换现有产品collectino。 在EF中这样做的最佳方法是什么?

基本上,从提供的集合中,如果指定了productid,则进行更新,如果实体不可用,则添加新产品。 如果不在列表中,则从数据库中删除。

这是我想要的。

using (var dbCtx = new MyDBEntities())
{
    //1- Get data from database
    //2- Find newly added items
    //3- Find deleted items
    //4- Find modified
    //5- Mark all added items entity state to Added
    //6- Mark all deleted item entity state to Deleted
    //7- Apply modified items current property values to existing property values
    dbCtx.SaveChanges();
}

1 个答案:

答案 0 :(得分:3)

让我们关注以下几点:

  1. 从数据库中获取数据
  2. 查找新添加的项目
  3. 查找已删除的项目
  4. 查找修改后的
  5. 将所有添加的项目实体状态标记为已添加
  6. 将所有已删除的项目实体状态标记为已删除
  7. 将修改后的项目当前属性值应用于现有属性值
  8. 您是否认为您正在尝试编写非常相似的代码来定义每个实体的状态?  我们可以使用一个命令处理所有这些操作。

    您可以使用新发布的EntityGraphOperations实体框架代码优先轻松实现此目的。我是这个产品的作者。我已将其发布在githubcode-projectnuget中。借助InsertOrUpdateGraph方法,它会自动将您的实体设置为AddedModified。在DeleteMissingEntities方法的帮助下,您可以删除数据库中存在的实体,但不能删除当前集合中的实体。

    // This will set the state of the main entity and all of it's navigational 
    // properties as `Added` or `Modified`.
    context.InsertOrUpdateGraph(category)
           .After(entity =>
           {
                // And this will delete missing products.
                entity.HasCollection(p => p.Products)
                   .DeleteMissingEntities();
           });  
    

    更新:
    经过一些评论后,我决定制作示例项目并解释如何编写示例项目。我已经通过逐步演示更新了my article in Code-project,并准备好下载示例项目。