EF6 CodeFirst мой столбец [Key] Id не автоматически увеличивается, как должен столбец идентификаторов
у меня есть несколько классов, которые мне нужно наследовать от базового класса, который имеет идентификатор. Игнорируя все, кроме одного из них на данный момент, скажем, у нас есть:
public class MyBase {
[Key]
public int Id { get; set; }
}
public class MyName : MyBase {
public string Name { get; set; }
}
мой контекст (DataContext) выглядит следующим образом:
public DbSet<MyName>MyNames { get; set; }
// to avoid having EF make a MyBases table and instead map
// MyBase.Id into MyNames and my other derived classes I do this ...
protected override void OnModelCreating((DbModelBuilder modelBuilder) {
modelBuilder.Entity<MyBase>()
.Property(c => c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<MyName>()
.Map(m => {
m.MapInheritedProperties();
m.ToTable("MyNames");
});
}
результирующая БД, когда я включаю-миграции, Add-Migration Initial и Update-Database, заключается в том, что я не получаю таблицу MyBases, но вместо этого я получаю столбец Id в MyNames
dbo.MyNames
-----------
Id (PK, int, not null)
Name (nvarchar(max), null)
так, все, что компилирует и строит, а затем я тестирую его, используя что-то вроде следующего:
using ( DataContext dc = new DataContext()) {
var jj = new MyName { Name = "Janice Joplin" };
dc.MyNames.Add(jj);
dc.SaveChanges();
var jh = new MyName { Name = "Jimmy Hendrix" };
dc.MyNames.Add(jh);
dc.SaveChanges();
}
это работает в первый раз (Дженис добавляется с Id = 0), но не второй ... Джимми получает исключение с дубликатом ключа. Примечание (для полного раскрытия) я фактически создаю объекты jj и jh в другой части моего кода, а затем передаю их в этот метод (выше) как объекты MyBase, а затем возвращаю их в объекты MyName, если это то, что они есть. Надеюсь, это не ... проблема.
Я думаю, если бы все было в одной таблице, Id можно было бы отметить как Identity и @ @ IDENTITY можно было бы использовать для присвоения значения идентификатора объекта. Возможно, мне все-таки придется сделать таблицу MyBases и сначала создать эту запись, а затем дублировать Id в производные таблицы в транзакции. Каков наилучший подход для этого?
любая помощь для этого Новичка EF6 CodeFirst будет оценена. СПАСИБО.
2 ответов
Я помню, когда я использовал EF, я бы создал таблицу с идентификатором, и в классе я бы приписал столбец id с
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
поэтому я предполагаю, что ваш код должен быть
modelBuilder.Entity<MyBase>()
.Property(c => c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Я считаю, что проблема заключается в том, что вы используете первые миграции кода EF6. Когда вы это делаете, вам нужно засеять свою БД с помощью.AddOrUpdate() метод. Этот Вопрос Переполнения Стека охватывает его.