asp.net – 如何强制实体框架插入标识列?

前端之家收集整理的这篇文章主要介绍了asp.net – 如何强制实体框架插入标识列?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想编写一些C#代码来初始化一些种子数据的数据库。显然,这将要求能够在插入时设置各种标识列的值。我使用的是代码优先的方法。默认情况下,DbContext处理数据库连接,因此您无法设置IDENTITY_INSERT [dbo]。[MyTable] ON。所以,我迄今为止做的是使用DbContext构造函数,让我指定要使用的DB连接。然后,我在该数据库连接中将IDENTITY_INSERT设置为ON,然后尝试使用实体框架插入我的记录。这是我迄今为止所做的一个例子:
  1. public class MyUserSeeder : IEntitySeeder {
  2. public void InitializeEntities(AssessmentSystemContext context,sqlConnection connection) {
  3. 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 });
  4. try {
  5. connection.Open();
  6. sqlCommand cmd = new sqlCommand("SET IDENTITY_INSERT [dbo].[MyUser] ON",connection);
  7. int retVal = cmd.ExecuteNonQuery();
  8. context.SaveChanges();
  9. }
  10. finally {
  11. connection.Close();
  12. }
  13. }
  14. }

如此接近但迄今为止 – 因为虽然cmd.ExecuteNonQuery()工作正常,但当我运行context.SaveChanges()时,我被告知“必须在表’MyUser’中为identity列指定显式值,当IDENTITY_INSERT被设置为ON或复制用户插入到NOT FOR REPLICATION标识列中时。

大概是因为MyUserId(这是MyUser表中的Identity列)是主键,当我调用context.SaveChanges()时,实体框架不会尝试设置它,尽管我给MyUser实体一个MyUserId的值属性

有没有办法强制实体框架尝试插入一个实体的主键值呢?或者可能是临时将MyUserId标记为不是主键值的方法,所以EF尝试插入?

解决方法

EF 6法,使用 msdn article
  1. using (var dataContext = new DataModelContainer())
  2. using (var transaction = dataContext.Database.BeginTransaction())
  3. {
  4. var user = new User()
  5. {
  6. ID = id,Name = "John"
  7. };
  8.  
  9. dataContext.Database.ExecutesqlCommand("SET IDENTITY_INSERT [dbo].[User] ON");
  10.  
  11. dataContext.User.Add(user);
  12. dataContext.SaveChanges();
  13.  
  14. dataContext.Database.ExecutesqlCommand("SET IDENTITY_INSERT [dbo].[User] OFF");
  15.  
  16. transaction.Commit();
  17. }

更新:为了避免错误“当IDENTITY_INSERT设置为ON或复制用户插入到NOT FOR REPLICATION标识列”时,必须为表“TableName”中的标识列指定显式值“,则应更改StoreGeneratedPattern属性的值身份列从身份到无模型设计师。

注意,将StoreGeneratedPattern更改为None将无法插入没有指定id(正常方式)的对象,当IDENTITY_INSERT设置为OFF时,错误“Can not insert explicit value for table”TableName“中的表列值。

猜你在找的asp.Net相关文章