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