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() метод. Этот Вопрос Переполнения Стека охватывает его.