我在EF上收到此错误。
无法在表中插入identity列的显式值 当IDENTITY_INSERT设置为OFF时,“GroupMembers_New”。
Db上的列是标识增量,在EF设计文件中,StoreGeneratedPattern
也是identity
。好像EF每次尝试保存时都试图插入0。
有些建议说ID会保留在表格中,或者删除表格并重新运行脚本。
有什么想法吗?
以下是一些代码:
GroupMember groupMember = new GroupMember();
groupMember.GroupId = group.Id;
groupMember.UserId = (new UserId(group.Owner));
//groupMember.Id = _groupContext.GroupMembers.Count();
group.GroupMembers.Add(groupMember);
_groupContext.SaveChanges();
答案 0 :(得分:55)
我之前遇到过这种情况。此错误意味着您尝试将值明确分配给数据库自动分配的列。
建议: 更新您的edmx文件以反映您可能在数据库中所做的任何更改。 如果数据库自动分配值,您应该在该属性下的设计器文件中看到“IsDbGenerated = true”属性。如果不存在,可以手动添加。
答案 1 :(得分:26)
试试这个:
using System.ComponentModel.DataAnnotations.Schema;
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public decimal Identity_Col { get; set; }
Entity Framework类文件将这些代码行添加到Identity列。
答案 2 :(得分:14)
将这些属性放在属性的顶部:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
答案 3 :(得分:5)
谷歌的第一场比赛,所以这是我的解决方案:
EF代码优先:由于自动增加PK'id'字段和guid列,设计如下:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid FileToken { get; set; }
有一个重复的身份。我改成了:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DefaultValue("newid()")]
public Guid FileToken { get; set; }
问题消失了。
希望它对你有所帮助。
埃里克
答案 4 :(得分:3)
在EF 6中,模型中的字段/列有一个属性可用于执行此操作: StoreGeneratedPattern。
在属性下拉列表中将其设置为“Identity”。
(我不知道EF 4.上面的答案,使用IsDbGenerated,似乎适用于EF 4.)
这在底层XML中对应于元素的属性:
<Property Name="MyTableId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
- 但您不需要手动处理XML,因为您可以使用设计器。
这是如何搞砸的还不清楚。从数据库中刷新模型后,我遇到了问题。如果在已经生成模型之后在表上设置PK或更改其名称,可能会感到困惑。 (我使用的是表/数据库优先方法,而不是代码优先。)
您不能使用上述方法将C#属性放在实体代码上,因为在这种情况下,实体代码由EF生成。 EF应该理解(“本身”)该字段是一个身份。
答案 5 :(得分:1)
我在我的应用中遇到过这个问题;并修复了它将id字段的属性“StoredGeneratedPattern”更改为Identity。
所以,转到模型;抬头看桌子;点击主要关键字的属性;并改变财产。
答案 6 :(得分:1)
请参见intercepting Entity Insert for generated always columns,例如历史记录表上的StartTime和EndTime列,以及rowversion列。
答案 7 :(得分:1)
我通过从插入数据中删除模型中的主键来解决这个问题。因为主键自增。
var book = new Book
{
// Id = 1, //Don't need to write this
Genre = "Technology",
Author = "Charles Petzold",
Title = "Programming Windows 5th Edition",
Price = 30,
Publisher = "Microsoft Press"
};
_unitOfWork.Books.Add(book);
答案 8 :(得分:0)
我在AspNetCore 2.x应用程序中遇到了相同的问题和错误消息。 我唯一可以解决此问题的方法是通过删除DbContext类的ModelBuilder.Entity方法中的这一行:
// remove: entity.Property(e => e.Id).ValueGeneratedNever();
答案 9 :(得分:0)
嗯,你需要给 ID 一个值,例如对于对象 Auto,你应该 VarAuto.Id = 0;
之后你可以这样做=>
using( MyContext db = new MyContext()){
db.Autos.Add(VarAuto);
db.SaveChanges();
}
就是给id赋值的解决方案,EF可以识别表中的标识值。
尝试一下。