我试图通过以下代码
使用EF插入重复记录db.Set<TEntity>().AddRange(lstEntity);
db.SaveChanges();
lstEntity
是TEntity
类型的列表。
假设我在lstEntity
中有6个元素,其中3个是重复的。
在AddRange
的第一行,它只添加了4个元素,因为3个元素是重复的,因此它添加了1个(3个重复的)+ 3个不同的记录,因此它变为4个。
因此,它只在DB中插入4条记录。
我需要允许这个重复的东西,并希望插入所有6个元素(重复和不同)。
答案 0 :(得分:3)
实体框架他正确地完成了他的工作,对象服务将找到重复的项目并在db中插入一次。想一想! 实体表示表中带有Id 的行。您不能多次插入同一行,您需要一个新的主键(Id)。
您可以克隆您的实体并将其添加到DbContext或使用this
你的名字是阿拉伯语所以我认为你可以理解阿拉伯文语只是看我的教程这将回答你所有的问题:
克隆示例:
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();
}
}