C# 实体框架错误:无法在表中插入标识列的显式值
我在EF上发现了这个错误 无法在表中插入标识列的显式值 当IDENTITY\u INSERT设置为OFF时为“GroupMembers\u New” Db上的列是identity increment,EF设计文件中的C# 实体框架错误:无法在表中插入标识列的显式值,c#,sql,entity-framework,C#,Sql,Entity Framework,我在EF上发现了这个错误 无法在表中插入标识列的显式值 当IDENTITY\u INSERT设置为OFF时为“GroupMembers\u New” Db上的列是identity increment,EF设计文件中的StoreGeneratedPattern也是identity。似乎每次我尝试保存时EF都在尝试插入0 一些建议说ID保留在表上,或者删除表并重新运行脚本 有什么想法吗 下面是一些代码: GroupMember groupMember = new GroupMember();
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();
我以前遇到过这个问题。此错误意味着您试图将值显式分配给数据库自动分配的列 建议: 更新edmx文件以反映您在数据库中所做的任何更改。 如果数据库自动分配该值,您应该在该属性下的设计器文件中看到“IsDbGenerated=true”属性。如果不存在,可以手动添加。尝试以下操作:
using System.ComponentModel.DataAnnotations.Schema;
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public decimal Identity_Col { get; set; }
实体框架类文件将这些代码行添加到标识列。在EF 6中,模型中的字段/列有一个属性用于执行此操作: StoreGeneratedPattern 在属性下拉列表中将其设置为“标识” (我不知道EF 4。上面的答案,使用IsDbGenerated,似乎是针对EF 4的。) 这在底层XML中对应于元素的一个属性:
<Property Name="MyTableId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
--但是您不需要手动处理XML,因为您可以使用设计器
这是怎么搞砸的还不清楚。即使在从数据库中刷新模型后,我也遇到了这个问题。如果在已经生成模型之后在表上设置PK或更改其名称,可能会感到困惑。(我使用的是表/数据库优先的方法,而不是代码优先。)
您不能使用上述将C#属性放在实体代码上的方法,因为在这种情况下,实体代码是由EF生成的。EF应该理解(“自身”)字段是一个标识。将这些属性放在标识属性的顶部:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
谷歌的第一个匹配,下面是我的解决方案: EF代码优先:由于自动递增的PK“id”字段和guid列,设计如下:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid FileToken { get; set; }
有一个重复的身份。我把它改成:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DefaultValue("newid()")]
public Guid FileToken { get; set; }
问题就解决了
希望对你有帮助
Erik我的应用程序中有这个问题;并修复了将id字段的属性“StoredGeneratedPattern”更改为Identity的问题
因此,请转到模型;找桌子;单击主键字段的属性;并更改属性。我在AspNetCore 2.x应用程序中遇到了相同的问题和错误消息。 解决此问题的唯一方法是删除DbContext类的ModelBuilder.Entity方法中的这一行:
// remove: entity.Property(e => e.Id).ValueGeneratedNever();
请参见历史记录表上的StartTime和EndTime列,以及rowversion列。好的,您需要为ID指定一个值,例如,对于对象Auto,只需VarAuto.ID=0 之后,您可以这样做=>
using( MyContext db = new MyContext()){
db.Autos.Add(VarAuto);
db.SaveChanges();
}
这就是解决方案,只要给id赋值,EF就可以识别表中的标识值
试试看。我通过删除模型中插入数据的主键解决了这个问题。因为主键自动递增
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);
事实上,更新edmx是解决方案。谢谢您在ef5中,在edmx designer中,有一个名为“StoreGeneratedPatern”的字段属性,将其设置为“Identity”,这似乎不适用于Azure移动服务。我有一个模型,它是一个字段:[Index(IsClustered=true)][DatabaseGeneratedOption(DatabaseGeneratedOption.Identity)][TableColumnAttribute(TableColumnType.CreatedAt)]公共DateTimeOffset?CreatedAt{get;set;}我添加了这个属性,现在我得到了这个错误:“ReferentialConstraint中的依赖属性映射到存储生成的列”首先,我有一个带有复合键的表,其中一列是Identity。添加属性
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
对我很有效。但这也会生成id。如果我想自己指定值并将其用作表的主键,该怎么办?首先使用EF核心代码,我有一个带有复合键的表,其中一列是Identity。添加属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
对我很有效。首先使用EF核心代码,我有一个带有复合键的表,其中一列是Identity。添加属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
对我很有效。看到了吗:哇,你救了我一天!这其实就是问题所在。。。自动脚手架确实产生了这条线,并造成了这样的麻烦!