【发布时间】:2016-05-06 04:18:36
【问题描述】:
我有一些类似于这些的代码优先实体:
public abstract class Animal {
public int ID { get; set; }
public int NumberOfLegs { get; set; }
}
public class Dog : Animal {
public string OtherDogRelatedStuff { get; set; }
}
public class Bird : Animal {
public string OtherBirdRelatedStuff { get; set; }
}
public class MyContext : DbContext {
public IDbSet<Animal> Animals { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
var pluraliser = PluralizationService.CreateService(new System.Globalization.CultureInfo("en-GB"));
modelBuilder.HasDefaultSchema("vs");
modelBuilder.Types().Configure(t => t.ToTable(pluraliser.Pluralize(t.ClrType.Name)));
// This next line doesn't give ID column IDENTITY(1,1)
modelBuilder.Entity<Animal>().Property(_ => _.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// This line puts IDENTITY(1,1) on Animal.ID, but causes errors when I try to add/update data.
//modelBuilder.Entity<Dog>().Property(_ => _.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
base.OnModelCreating(modelBuilder);
}
}
我想要每种类型的表格......所以表格看起来像这样:
CREATE TABLE Animals (
ID INT NOT NULL IDENTITY(1,1),
NumberOfLegs INT NOT NULL,
CONSTRAINT pkAnimals PRIMARY KEY (ID)
)
CREATE TABLE Dogs (
ID INT NOT NULL,
OtherDogRelatedStuff VARCHAR(200),
CONSTRAINT pkDogs PRIMARY KEY (ID),
CONSTRAINT fkAnimal_Dog FOREIGN KEY (ID) REFERENCES Animals(ID)
)
CREATE TABLE Birds (
ID INT NOT NULL,
OtherBirdRelatedStuff VARCHAR(200),
CONSTRAINT pkBirds PRIMARY KEY (ID),
CONSTRAINT fkAnimal_Bird FOREIGN KEY (ID) REFERENCES Animals(ID)
)
数据看起来像这样:
---Animals----------
ID NumberOfLegs
1 4
2 4
3 2
---Dogs---------------------
ID OtherDogRelatedStuff
1 Woof1
2 Woof2
---Birds---------------------
ID OtherCatRelatedStuff
3 Sqwark1
但我无法让自动增量 ID 正常工作或配置正确。
我试过了:
modelBuilder.Entity<Animal>().Property(_ => _.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
但是因为Animal 是抽象的,这似乎没有在表格上设置IDENTITY(1,1) 属性。
我也尝试在 Dog 实体上执行相同的操作,它正确地将标识属性添加到 Animals 表中的 ID 列,但是当我尝试将新实体添加到SaveChanges() 方法上的数据库:
A dependent property in a ReferentialConstraint is mapped to a store-generated column. Column: 'ID'.
如何正确地将抽象类型上的 ID 列设置为自动递增,并使其在添加数据时起作用?
【问题讨论】:
-
请链接您的 dbcontext 类的相关部分
-
@AlexanderDerck:完成。
-
注意到你在动物和狗上都有
ID,而Dog从Animal继承它 -
啊,是的,当我写这个问题时,那是一个错误。我的真实班级在具体班级中没有 ID。我会解决的。
-
我还将添加第二个具体类,以进一步阐明我的真实结构是什么样的。
标签: c# entity-framework abstract-class auto-increment identity