如何控制EF插入数据库

本文关键字:EF 插入 数据库 控制 何控制 | 更新日期: 2023-09-27 18:12:45

我有3个表Goods, Producer, CategoriesProducerCategoriesGoods有一对多的关系,我有一个通用的插入方法,代码如下所示。

问题是,当我试图插入商品列表时,第一个商品被正确添加,但如果下一个具有相同id的类别,则抛出关于主键的异常。

但是我想控制插入之类的东西,每次插入表CategoriesProducer之前检查,如果行已经存在,只需更新它,例如或跳过。

带有模型和泛型插入的代码:

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();
        }
}

如何控制EF插入数据库

您可以使用新发布的实体框架代码的EntityGraphOperations首先轻松实现这一点。我已经在github, code-project和nuget中发布了它。在InsertOrUpdateGraph方法的帮助下,它会自动将你的实体设置为AddedModified

 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的文章,其中有一步一步的演示,并准备了一个示例项目供下载。