我有以下具有一对多关系的类
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();
}
答案 0 :(得分:3)
让我们关注以下几点:
您是否认为您正在尝试编写非常相似的代码来定义每个实体的状态? 我们可以使用一个命令处理所有这些操作。
您可以使用新发布的EntityGraphOperations实体框架代码优先轻松实现此目的。我是这个产品的作者。我已将其发布在github,code-project和nuget中。借助InsertOrUpdateGraph
方法,它会自动将您的实体设置为Added
或Modified
。在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,并准备好下载示例项目。