Подтвердить что ты не робот

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");
                });
}

Результирующая БД, когда я Enable-Migrations, 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), но не второй... Джимми получает исключение DUPLICATE KEY. Примечание (для полного раскрытия) Я на самом деле создаю объекты jj и jh в другой части моего кода, а затем передаю их в этот метод (выше) как объекты MyBase, а затем отбрасывая их обратно в объекты MyName, если это то, что они есть. Надеюсь, это не проблема.

Я предполагаю, что если все было в одной таблице, идентификатор может быть помечен как Identity, а @@IDENTITY можно использовать для назначения значения идентификатора объекта. Возможно, мне нужно будет создать таблицу MyBases и сначала создать эту запись, а затем дублировать идентификатор в производные таблицы в транзакции. Какой лучший подход для этого?

Любая помощь для этого EF6 CodeFirst-новичка будет оценена по достоинству. БЛАГОДАРЮ.

4b9b3361

Ответ 1

Помню, когда я делал EF, я бы создал таблицу с Identity, а в классе я бы присвоил столбец id

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

поэтому я предполагаю, что ваш код должен быть

   modelBuilder.Entity<MyBase>()
        .Property(c => c.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Ответ 2

Я считаю, что проблема заключается в том, что вы используете EF6 Code First Migrations. Когда вы это делаете, вам нужно засеять свою БД, используя метод .AddOrUpdate(). Этот вопрос о переполнении стека охватывает его.