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

标签 asp.net sql-server database entity-framework ef-code-first

我想编写一些 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/

相关文章:

asp.net - HTTP POST 不适用于 Internet Explorer 8(重定向后)

c# - 尝试协商时出现 SignalR 404 错误

asp.net - 如何在asp.net 2.0中从子页面刷新父页面

sql-server - SQL Server - 将服务器和数据库传递给存储过程

c# - 如何在C#中同时检索存储过程的结果值和select语句?

database - CakePHP 根据同一行中的其他值更新字段值?

Mysql - 对具有相同列内容的行进行排序

asp.net - 为 Web API 操作设置默认媒体格式化程序

html - 如何在 SQL+HTML 脚本生成的电子邮件中左对齐列条目

database - 降级AWS RDS实例存储类型和备份保留期限是否会导致停机和数据丢失?