我有一个模型与DatabaseGeneratedOption.Identity
,但在特定情况下,想要保存具有特定值为主键的实体;
ie强制id = 1
实体框架覆盖DatabaseGeneratedOption.Identity
如果我只是分配值并保存,id将被自动生成的值覆盖。
var model = new User {Id = 1};
dbContext.SaveChanges();
Asser.AreEqual(1, model.Id); // false
我有一个模型与DatabaseGeneratedOption.Identity
,但在特定情况下,想要保存具有特定值为主键的实体;
ie强制id = 1
实体框架覆盖DatabaseGeneratedOption.Identity
如果我只是分配值并保存,id将被自动生成的值覆盖。
var model = new User {Id = 1};
dbContext.SaveChanges();
Asser.AreEqual(1, model.Id); // false
我通过这个方法做的:
public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public new int Id { get; set; }
//Rest of the fields...
}
你也可以将它覆盖用户的类。
这不会覆盖SQL Server标识设置。 –
您可以在保存更改前设置标识插入。这是样本。
var model = new User {Id = 1};
dbContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] ON");
dbContext.SaveChanges();
dbContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] OFF");
Asser.AreEqual(1, model.Id);
将[dbo]。[User]替换为用户表的名称。
实体框架中没有任何东西可以让您使用SET IDENTITY_INSERT ON恐怕。在特定情况下,您可以实施存储过程来完成这项工作:https://msdn.microsoft.com/en-us/data/dn468673.aspx –