У меня есть несколько первых объектов кода, похожих на эти:
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
Но я не могу заставить идентификатор автоматического увеличения работать или правильно настроен.
Я пробовал это:
modelBuilder.Entity<Animal>().Property(_ => _.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Но поскольку Animal
является абстрактным, похоже, это не устанавливает свойство IDENTITY(1,1)
в таблице.
Я также пробовал сделать то же самое с сущностью Dog
, которая правильно добавляет свойство идентификатора в столбец идентификатора в таблице Animals
, но я получаю UpdateException
, когда пытаюсь добавить новые сущности в базу данных с помощью метода SaveChanges()
:
A dependent property in a ReferentialConstraint is mapped to a store-generated column. Column: 'ID'.
Как правильно настроить столбец идентификатора абстрактного типа на автоматическое увеличение и заставить его работать при добавлении данных?
ID
и у животного, и у собаки, аDog
наследует его отAnimal
- person Alexander Derck   schedule 29.01.2016modelBuilder.Types().Configure(t => t.ToTable(pluraliser.Pluralize(t.ClrType.Name)));
также отображаетAnimal
в таблицу, чего не должно происходить. Вы можете только сопоставить производные классы с таблицей - person Alexander Derck   schedule 29.01.2016modelBuilder.Types().Where(t => t != typeof(Animal)).Configure(t => t.ToTable(pluraliser.Pluralize(t.ClrType.Name)));
, но столбец ID в таблице Animals не получает IDENTITY (1,1) - person BG100   schedule 29.01.2016DbSet
вместоIDbSet
, и вместо сопоставления всех типов с таблицей я делаю это для каждой Entity, так что вродеmodelBuilder.Entity<Dog>().ToTable("Dogs");
. Я не думаю, что это вызывает проблему, но кто знает ... - person Alexander Derck   schedule 29.01.2016