Identitt_insert 设置为 OFF 时无法插入标识值
Cannot insert value for identity when Identitt_insert is set to OFF
我知道我不是第一个在这里问这个问题的人。但是在经历了很多关于这个的答案之后,我仍然无法解决我的问题。
原来如此。
我的 Code First 模型中有多个派生模型,共享相同的标识 属性。
这是我的模型示例
public class Foo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FooId { get; set; }
public string SomeProperty{get;set;}
}
public class DerivedFoo : Foo
{
public string SomeOtherProperty {get;set;}
}
public class EvenMordeDerivedFoo : DerivedFoo
{
public string AndAnotherProperty {get;set;}
}
所以根据我的理解,我的 FooContext 重写应该如下所示:
public class FooContext : DbContext
{
public DbSet<Foo> Foos{get;set;}
public DbSet<DerivedFoo> DerivedFoos{get;set;}
public DbSet<EvenMordeDerivedFoo > EvenMordeDerivedFoos{get;set;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<DerivedFoo>().ToTable("DerivedFoo");
modelBuilder.Entity<EvenMordeDerivedFoo >().ToTable("EvenMordeDerivedFoo ");
}
}
有了这个,我可以毫无问题地使用 Foo 创建 运行 context.SaveChanges() 。但是当我尝试通过以下方式创建 DerivedFoo 时:
var derivedFoo= _context.DerivedFoos.Create();
_context.DerivedFoos.Add(derivedFoo);
_context.SaveChanges();
我遇到了臭名昭著的错误:
"Cannot insert explicit value for identity column in table
'DerivedFoo' when IDENTITY_INSERT is set to OFF."
根据我的理解,Entity Framework 试图解释如果我将 Identity_Insert 设置为 true,我不应该自己修改属性 FooId。
我同意 EF 的观点,因为我希望每次创建新的 Foo、DerivedFoo 或 EvenMordeDerivedFoo 时都设置这个 FooId 属性,这解释了我添加行
的原因
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
所以如果有人能解释我做错了什么可以解释,那就太好了。
编辑:我仍然找不到答案,经过验证,我的模型大部分匹配this tutorial模型。所以我很确定答案很简单,但我没能找到我错过的东西
I should add some ID properties in DerivedFoo and EvenMoreDerivedFoo
没有。实体很好。派生类型的表不能有 IDENTITY 属性.
EG,这将创建只有 Foo 的 ID 列具有 IDENTITY 属性:
的表
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
namespace Ef6Test
{
public class Foo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FooId { get; set; }
public string SomeProperty { get; set; }
}
public class DerivedFoo : Foo
{
public string SomeOtherProperty { get; set; }
}
public class EvenMordeDerivedFoo : DerivedFoo
{
public string AndAnotherProperty { get; set; }
}
class Db : DbContext
{
public DbSet<Foo> Foos { get; set; }
public DbSet<DerivedFoo> DerivedFoos { get; set; }
public DbSet<EvenMordeDerivedFoo> EvenMordeDerivedFoos { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<DerivedFoo>().ToTable("DerivedFoo");
modelBuilder.Entity<EvenMordeDerivedFoo>().ToTable("EvenMordeDerivedFoo ");
}
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<Db>());
using (var db = new Db())
{
db.Database.Log = m => Console.WriteLine(m);
db.Database.Initialize(true);
var derivedFoo = db.DerivedFoos.Create();
db.DerivedFoos.Add(derivedFoo);
db.SaveChanges();
}
Console.WriteLine("Hit any key to exit");
Console.ReadKey();
}
}
}
我知道我不是第一个在这里问这个问题的人。但是在经历了很多关于这个的答案之后,我仍然无法解决我的问题。
原来如此。
我的 Code First 模型中有多个派生模型,共享相同的标识 属性。
这是我的模型示例
public class Foo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FooId { get; set; }
public string SomeProperty{get;set;}
}
public class DerivedFoo : Foo
{
public string SomeOtherProperty {get;set;}
}
public class EvenMordeDerivedFoo : DerivedFoo
{
public string AndAnotherProperty {get;set;}
}
所以根据我的理解,我的 FooContext 重写应该如下所示:
public class FooContext : DbContext
{
public DbSet<Foo> Foos{get;set;}
public DbSet<DerivedFoo> DerivedFoos{get;set;}
public DbSet<EvenMordeDerivedFoo > EvenMordeDerivedFoos{get;set;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<DerivedFoo>().ToTable("DerivedFoo");
modelBuilder.Entity<EvenMordeDerivedFoo >().ToTable("EvenMordeDerivedFoo ");
}
}
有了这个,我可以毫无问题地使用 Foo 创建 运行 context.SaveChanges() 。但是当我尝试通过以下方式创建 DerivedFoo 时:
var derivedFoo= _context.DerivedFoos.Create();
_context.DerivedFoos.Add(derivedFoo);
_context.SaveChanges();
我遇到了臭名昭著的错误:
"Cannot insert explicit value for identity column in table 'DerivedFoo' when IDENTITY_INSERT is set to OFF."
根据我的理解,Entity Framework 试图解释如果我将 Identity_Insert 设置为 true,我不应该自己修改属性 FooId。
我同意 EF 的观点,因为我希望每次创建新的 Foo、DerivedFoo 或 EvenMordeDerivedFoo 时都设置这个 FooId 属性,这解释了我添加行
的原因[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
所以如果有人能解释我做错了什么可以解释,那就太好了。
编辑:我仍然找不到答案,经过验证,我的模型大部分匹配this tutorial模型。所以我很确定答案很简单,但我没能找到我错过的东西
I should add some ID properties in DerivedFoo and EvenMoreDerivedFoo
没有。实体很好。派生类型的表不能有 IDENTITY 属性.
EG,这将创建只有 Foo 的 ID 列具有 IDENTITY 属性:
的表using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
namespace Ef6Test
{
public class Foo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FooId { get; set; }
public string SomeProperty { get; set; }
}
public class DerivedFoo : Foo
{
public string SomeOtherProperty { get; set; }
}
public class EvenMordeDerivedFoo : DerivedFoo
{
public string AndAnotherProperty { get; set; }
}
class Db : DbContext
{
public DbSet<Foo> Foos { get; set; }
public DbSet<DerivedFoo> DerivedFoos { get; set; }
public DbSet<EvenMordeDerivedFoo> EvenMordeDerivedFoos { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<DerivedFoo>().ToTable("DerivedFoo");
modelBuilder.Entity<EvenMordeDerivedFoo>().ToTable("EvenMordeDerivedFoo ");
}
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<Db>());
using (var db = new Db())
{
db.Database.Log = m => Console.WriteLine(m);
db.Database.Initialize(true);
var derivedFoo = db.DerivedFoos.Create();
db.DerivedFoos.Add(derivedFoo);
db.SaveChanges();
}
Console.WriteLine("Hit any key to exit");
Console.ReadKey();
}
}
}