gpt4 book ai didi

asp.net - 如何强制 Entity Framework 插入标识列?

转载 作者:太空狗 更新时间:2023-10-30 01:37:50 25 4
gpt4 key购买 nike

我想编写一些 C# 代码来用一些种子数据初始化我的数据库。显然,这将需要能够在插入时设置各种标识列的值。我正在使用代码优先的方法。默认情况下,DbContext 处理数据库连接,因此您不能 SET IDENTITY_INSERT [dbo].[MyTable] ON。所以,到目前为止,我所做的是使用 DbContext 构造函数,它让我指定要使用的数据库连接。然后,我在该数据库连接中将 IDENTITY_INSERT 设置为 ON,然后尝试使用 Entity Framework 插入我的记录。这是我到目前为止所获得的示例:

public class MyUserSeeder : IEntitySeeder {
public void InitializeEntities(AssessmentSystemContext context, SqlConnection connection) {
context.MyUsers.Add(new MyUser { MyUserId = 106, ConceptPersonId = 520476, Salutation = "Mrs", Firstname = "Novelette", Surname = "Aldred", Email = null, LoginId = "520476", Password="28c923d21b68fdf129b46de949b9f7e0d03f6ced8e9404066f4f3a75e115147489c9f68195c2128e320ca9018cd711df", IsEnabled = true, SpecialRequirements = null });
try {
connection.Open();
SqlCommand cmd = new SqlCommand("SET IDENTITY_INSERT [dbo].[MyUser] ON", connection);
int retVal = cmd.ExecuteNonQuery();
context.SaveChanges();
}
finally {
connection.Close();
}
}
}

这么近又这么远 - 因为虽然 cmd.ExecuteNonQuery() 工作正常,但当我运行 context.SaveChanges() 时,我被告知“当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表‘MyUser’中的标识列指定显式值。”

据推测,因为 MyUserId(MyUser 表中的身份列)是主键, Entity Framework 在我调用 context.SaveChanges() 时不会尝试设置它,即使我为 MyUser 实体提供了 MyUserId 属性的值。

有没有办法强制 Entity Framework 尝试插入实体的主键值,那么呢?或者可能是暂时将 MyUserId 标记为不是主键值的方法,以便 EF 尝试插入它?

最佳答案

EF 6 方法,使用 msdn article :

using (var dataContext = new DataModelContainer())
using (var transaction = dataContext.Database.BeginTransaction())
{
var user = new User()
{
ID = id,
Name = "John"
};

dataContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] ON");

dataContext.User.Add(user);
dataContext.SaveChanges();

dataContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[User] OFF");

transaction.Commit();
}

更新:当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,避免错误“必须为表‘TableName’中的标识列指定显式值” ",您应该在模型设计器中将身份列的 StoreGeneratedPattern 属性的值从 Identity 更改为 None

请注意,将 StoreGeneratedPattern 更改为 None 将无法插入没有指定 ID 的对象(正常方式)并出现错误“当 IDENTITY_INSERT 设置为 OFF 时,无法为表‘TableName’中的标识列插入显式值”。

关于asp.net - 如何强制 Entity Framework 插入标识列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13086006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com