如何控制EF插入数据库
本文关键字:EF 插入 数据库 控制 何控制 | 更新日期: 2023-09-27 18:12:45
我有3个表Goods
, Producer
, Categories
。Producer
和Categories
与Goods
有一对多的关系,我有一个通用的插入方法,代码如下所示。
问题是,当我试图插入商品列表时,第一个商品被正确添加,但如果下一个具有相同id的类别,则抛出关于主键的异常。
但是我想控制插入之类的东西,每次插入表Categories
和Producer
之前检查,如果行已经存在,只需更新它,例如或跳过。
带有模型和泛型插入的代码:
public class Good
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public virtual Category Category { get; set; }
public virtual Producer Producer { get; set; }
public override string ToString()
{
return Id + "/" + Name + "/" + Price + "/" + Category.Name + "/" + Producer.Name + "/" + Producer.Country;
}
}
public class Producer
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Name { get; set; }
public string Country { get; set; }
public virtual ICollection<Good> Goods { get; set; }
public override string ToString()
{
return Id + "/" + Name + "/" + Country;
}
}
public class Category
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Good> Goods { get; set; }
public override string ToString()
{
return Id + "/" + Name;
}
}
public void AddList(List<T> collection, DbContext GoodsContext)
{
foreach (var item in collection)
{
GoodsContext.Set<T>().Add(item);
GoodsContext.SaveChanges();
}
}
您可以使用新发布的实体框架代码的EntityGraphOperations首先轻松实现这一点。我已经在github, code-project和nuget中发布了它。在InsertOrUpdateGraph
方法的帮助下,它会自动将你的实体设置为Added
或Modified
。
foreach (var item in collection)
{
// This will set the state of the main entity and all of it's navigational
// properties as `Added` or `Modified`.
GoodsContext.InsertOrUpdateGraph(item);
GoodsContext.SaveChanges();
GoodsContext.Entry(item).State = EntityState.Detached;
}
您可以阅读我关于Code-project的文章,其中有一步一步的演示,并准备了一个示例项目供下载。