Entity framework 4 EF CodeFirst初始值设定项-无法设置PK值
我正在对一小部分表进行数据迁移。当然,这些键在源数据库中对齐,我编写了类似于以下语句的初始化语句:Entity framework 4 EF CodeFirst初始值设定项-无法设置PK值,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,我正在对一小部分表进行数据迁移。当然,这些键在源数据库中对齐,我编写了类似于以下语句的初始化语句: context.Countries.Add(new Country{CountryId=75,CountryName="US"}); context.Countries.Add(new Country{CountryId=89,CountryName="Argentina"}); 但是,当我随后查看数据库时,我发现: CountryID | CountryName ---------------
context.Countries.Add(new Country{CountryId=75,CountryName="US"});
context.Countries.Add(new Country{CountryId=89,CountryName="Argentina"});
但是,当我随后查看数据库时,我发现:
CountryID | CountryName
------------------------
1 | US
2 | Argentina
(它忽略我提供的CountryID,并为此标识列使用n+1值。)
为了解决这个问题,我尝试了以下方法:
context.Database.ExecuteSqlCommand("Set IDENTITY_INSERT COUNTRIES ON");
GetCountries().ForEach(c=>context.Countries.Add(c));
context.Database.ExecuteSqlCommand("Set IDENTITY_INSERT COUNTRIES OFF");
但我看不出db中的键有什么不同
如何从初始值设定项的Seed()方法插入标识
编辑:
我将发布我最后一次尝试的结果,以方便以下任何人:
private void InsertCountries(SodContext context)
{
context.Database.ExecuteSqlCommand("Set IDENTITY_INSERT COUNTRIES ON");
string cmd = "INSERT INTO COUNTRIES (CountryId,Name,IsActive) values ({0},'{1}',{2})";
GetCountries().ForEach(cntry=>context.Database.ExecuteSqlCommand(string.Format(cmd,cntry.CountryId,cntry.Name,cntry.IsActive==false?0:1)));
context.Database.ExecuteSqlCommand("Set IDENTITY_INSERT COUNTRIES OFF");
}
但是,我收到一条错误消息,我必须打开IDENTITY_INSERT
我将放弃并切换到在TSQL脚本中执行此操作。如果您已将主键属性配置为数据库生成的标识(即:自动增量),则EF将不会在发出的insert语句中包含该列。因此EF将请求生成的密钥并更新主键属性
您可以做的是编写必要的数据脚本,并直接执行该脚本,而不使用实体。我尝试了您在c代码中尝试的内容。 将所有内容放在同一个sql命令语句中确实有效
const string sqlCmd = "set identity_insert [role] on insert into [role](id, name) values({0}, {1}) set identity_insert [role] off";
context.Database.ExecuteSqlCommand(sqlCmd,(int)SystemRole.SuperAdministrator, superAdminRole);
context.Database.ExecuteSqlCommand(sqlCmd, (int)SystemRole.Administrator, adminRole);
context.Database.ExecuteSqlCommand(sqlCmd, (int)SystemRole.Manager, managerRole);
context.Database.ExecuteSqlCommand(sqlCmd, (int)SystemRole.User, userRole);