需要在带有列表的Entity Framework中插入重复记录

时间:2016-07-13 06:57:44

标签: c# entity-framework

我试图通过以下代码

使用EF插入重复记录
db.Set<TEntity>().AddRange(lstEntity);
db.SaveChanges();

lstEntityTEntity类型的列表。

假设我在lstEntity中有6个元素,其中3个是重复的。

AddRange的第一行,它只添加了4个元素,因为3个元素是重复的,因此它添加了1个(3个重复的)+ 3个不同的记录,因此它变为4个。

因此,它只在DB中插入4条记录。

我需要允许这个重复的东西,并希望插入所有6个元素(重复和不同)。

1 个答案:

答案 0 :(得分:3)

实体框架他正确地完成了他的工作,对象服务将找到重复的项目并在db中插入一次。想一想! 实体表示表中带有Id 的行。您不能多次插入同一行,您需要一个新的主键(Id)。

您可以克隆您的实体并将其添加到DbContext或使用this

你的名字是阿拉伯语所以我认为你可以理解阿拉伯文语只是看我的教程这将回答你所有的问题:

Video

克隆示例:

public class City
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int Id { get; set; }

  public City Clone()
  {
    return (City)MemberwiseClone();
  }

}

public class MyDbContext : DbContext
{
  public MyDbContext(string connectionString)
        : base("name=" + connectionString)
  {
  }

  public DbSet<City> Cities { get; set; }
}

public static void Main(string[] args)
{
  Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>());

  using (var myDbContext = new MyDbContext())
  {
    // This will add the city one time  => the bug
    var city = new City();

    var list = new List<City>();
    list.Add(city);
    list.Add(city);

    myDbContext.Cities.AddRange(list);
    myDbContext.SaveChanges();

    // This will add the city 2 times
    city = new City();
    var city2 = new City();

    list = new List<City>();
    list.Add(city);
    list.Add(city2);

    myDbContext.Cities.AddRange(list);
    myDbContext.SaveChanges();

    // This will add the clonned city1 and city=> Fix!
    var cityCloned1 = city.Clone();
    var cityCloned2 = city2.Clone();

    list = new List<City>();
    list.Add(cityCloned1);
    list.Add(cityCloned2);

    myDbContext.Cities.AddRange(list);
    myDbContext.SaveChanges();

  }

}

结果: enter image description here