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()时,我被告知“必须在表’MyUser’中为identity列指定显式值,当IDENTITY_INSERT被设置为ON或复制用户插入到NOT FOR REPLICATION标识列中时。
大概是因为MyUserId(这是MyUser表中的Identity列)是主键,当我调用context.SaveChanges()时,实体框架不会尝试设置它,尽管我给MyUser实体一个MyUserId的值属性。
有没有办法强制实体框架尝试插入一个实体的主键值呢?或者可能是临时将MyUserId标记为不是主键值的方法,所以EF尝试插入?
解决方法
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属性的值身份列从身份到无模型设计师。
注意,将StoreGeneratedPattern更改为None将无法插入没有指定id(正常方式)的对象,当IDENTITY_INSERT设置为OFF时,错误“Can not insert explicit value for table”TableName“中的表列值。
原文地址:https://www.jb51.cc/aspnet/253523.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。