我有一个拥有标识列的实体。作为数据种子的一部分,我想使用"标准数据的特定标识符值"在我的系统中。 我不想要禁用身份。 只有我想在迁移种子中设置IDENTITY_INSERT ON。
我的代码是:
protected override void Seed(DelphyWCFTestService.Model.DataContext context)
{
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
context.Cities.AddOrUpdate(
p => p.CityId,
new City { CityId = 1, Title = "Paris" }
);
}
但我的CityId没有自动插入插入和身份
我的实体框架版本是6.1.3
更新
我将我的代码更改为:
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
var cities = new List<City>
{
new City { CityId = 1, Title = "Paris" }
};
context.Cities.AddRange(cities);
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] Off ");
并且问题没有解决。
答案 0 :(得分:3)
AddOrUpdate并不像标准LINQ(see here).
那样简单我会使用标准的LINQ:
if (!context.Cities.Any())
{
using (var transaction = context.Database.BeginTransaction())
{ var cities = new List<City>
{
new City { CityId = 1, Title = "Paris" },
new City { CityId = 2, Title = "London" },
...
new City { CityId = 99, Title = "Rome" }
}
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
context.Cities.AddRange(cities);
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] Off ");
transaction.Commit();
}
}
如果您要添加到现有城市,您可以逐个测试:
if (!context.Cities.Any(c => c.CityId == 1))
{
context.Cities.Add(new City { CityId = 1, Title = "Paris" });
}
... repeat for all cities
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] On ");
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Cities] Off ");
答案 1 :(得分:0)
你可以在这里找到一个很好的解释:
http://blog.robertobonini.com/2014/10/09/entity-framework-with-identity-insert/
您可以使用两个封装的范围来解决问题。