16

Id を保持する共通の基本クラスから派生させる必要があるいくつかのクラスがあります。今のところ、これらのうちの 1 つを除くすべてを無視して、次のようなものがあるとしましょう。

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

結果の DB は、Enable-Migrations、Add-Migration Initial、および Update-Database を実行すると、MyBases というテーブルが取得されず、代わりに MyNames の Id 列が取得されます。

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

これは最初は機能しますが (Janice は Id = 0 で追加されます) 、2 回目は機能しません... Jimmy は DUPLICATE KEY 例外を受け取ります。注(完全な開示のために)実際には、コードの別の部分で jj オブジェクトと jh オブジェクトを作成し、それらを MyBase オブジェクトとしてこのメ​​ソッド(上記)に渡します。それが問題ではないことを願っています。

すべてが 1 つのテーブルにある場合、Id を Identity としてマークし、@@IDENTITY を使用してオブジェクト ID 値を割り当てることができると思います。結局、MyBases テーブルを作成し、最初にそのレコードを作成してから、ID をトランザクション内の派生テーブルに複製する必要があるでしょう。これに対する最善のアプローチは何ですか?

この EF6 CodeFirst 初心者のための助けをいただければ幸いです。ありがとう。

4

2 に答える 2

0

問題は、EF6 Code First Migrations を使用しているという事実にあると思います。そうするときは、.AddOrUpdate() メソッドを使用して DB をシードする必要があります。This Stack Overflow Questionでカバーされています。

于 2017-01-11T05:01:02.210 に答える