为了账号安全,请及时绑定邮箱和手机立即绑定

如何强制实体框架插入标识列?

如何强制实体框架插入标识列?

翻阅古今 2019-10-11 11:12:03
我想编写一些C#代码以使用一些种子数据初始化数据库。显然,这将要求在插入时能够设置各种Identity列的值的能力。我正在使用代码优先方法。默认情况下,DbContext处理数据库连接,因此您不能SET IDENTITY_INSERT [dbo].[MyTable] ON。因此,到目前为止,我所做的是使用DbContext构造函数,该构造函数允许我指定要使用的数据库连接。然后,我设置IDENTITY_INSERT到ON该数据库的连接,然后尝试使用实体框架插入我的记录。这是到目前为止我得到的一个例子: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或将复制用户设置为ID时,必须为表'MyUser'中的标识列指定显式值插入NOT FOR REPLICATION身份列。”大概是因为MyUserId(这是MyUser表中的Identity列)是主键,所以context.SaveChanges()即使我为MyUser实体赋予了MyUserId属性值,实体框架也不会在调用时尝试设置它。有没有办法强迫实体框架尝试为实体插入甚至主键值呢?还是一种临时标记MyUserId为不是主键值的方法,以便EF尝试将其插入?
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 541 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信