2016-11-23 14 views
0

私は、テーブル・コンクリート・タイプ(TPC)マッピングを備えたテーブル階層を持っています。 (Iわからない[キー列]属性は、それが動作するはずです必要はなくhttps://stackoverflow.com/a/19792915/959779に応じていること)EF6のコンポジット・キーによるコンポジット・タイプ(TPC)マッピングのテーブル

クラス構造:

public abstract class BaseEntity 
{ 
    [Key, Column(Order = 0)] 
    public int Id { get; set; } 
} 
public class Page: BaseEntity { 
    string Data { get; set; } 
} 
public class PageBackup: Page { 
    [Key, Column(Order = 1)] 
    public int PageId { get; set; } 
    public virtual Page Page { get; set; } 
} 

PagePageBackupエンティティのIdがテーブルに追加した後(交差していますいくつかのアイテム)EFは、固有の主キーを持たなければならないのEntitySet 『EUICDataContext.Pages』に次のexcutionに

」すべてのオブジェクトを投げる。 をしかし、 'Entities.PageBackup'タイプのインスタンスと 'Entities.Page'タイプのインスタンスは、どちらも同じ主キー値 'EntitySet = Pages; Id = 6'を持ちます。

CREATE TABLE [dbo].[PageBackup](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [PageId] [int] NOT NULL, 
    [Data] [nvarchar](max) NULL, 
    CONSTRAINT [PK_dbo.PageBackup] PRIMARY KEY CLUSTERED 
    (
      [Id] ASC 
    ) 

はEFが可能です。「以下

エンティティマッピングコード:EFでPageMappingが複合キーUpdate-Databaseシードスクリプトは次のシグネチャを持つテーブルを作成有するが

class PageMapping : EntityTypeConfiguration<Page> 
{ 
    public PageMapping() 
    { 
     Map(m =>{ m.ToTable("Page"); }); 
     HasKey(t => t.Id }); 
    } 
} 

class PageBackupMapping : EntityTypeConfiguration<PageBackup> 
{ 
    public PageBackupMapping() 
    { 
     Map(m =>{ 
      m.MapInheritedProperties(); 
      m.ToTable("PageBackup"); 
     }); 
     HasKey(t => new { t.Id, t.PageId }); 
    } 
} 

問題です複合キーを使用してテーブルを作成する(マッピングの例がたくさんあるが、移行については何も見つかりませんでした)

TPCマッピングの代わりにそのような設定を記述する方法は?

その他のソリューション提案が参考になります。

答えて

1

私はそれを再生していますが、このケースはEF 6でサポートされていないようです。マイグレーションはIDプライマリキーで自動的に生成されます。

CreateTable(
      "dbo.PageBackUp", 
      c => new 
       { 
        Id = c.Int(nullable: false), 
        PageId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

その後、私はEF Core 1.1.0でこれを管理しようとしました。その場合にエラーが発生しました

派生型であるため、「ページ」にキーを設定することはできません。 キーはルートタイプ 'BaseEntity'で設定する必要があります。 モデルに 'BaseEntity'を含める予定がない場合は、 がコンテキストのDbSetプロパティに含まれていないこと、ModelBuilderの コンフィグレーションコールで参照されていること、またはナビゲーションの プロパティから参照されていることを確認してください。タイプに含まれています。

これはEntity Frameworkの制限だと思います。この質問でEF repoに問題を提起することができます。

マイEFコア構成は以下のとおりであった:

public class ProductContext : DbContext 
{ 
    public ProductContext() 
    { 

    } 
    public ProductContext(DbContextOptions<ProductContext> options) 
     : base(options) 
    { } 

    public DbSet<Page> Page { get; set; } 
    public DbSet<PageBackup> PageBackup { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder builder) 
    { 
     builder.UseSqlServer("Data Source=.\\sqlexpress;"); 
     base.OnConfiguring(builder); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Page>() 
      .HasBaseType<BaseEntity>() 
      .ToTable("Page") 
      .HasKey(t => t.Id); 

     modelBuilder.Entity<PageBackup>() 
      .HasBaseType<Page>() 
      .HasKey(t => new { t.PageId, t.Id }); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

EF 6版:

public class ProductContext : DbContext 
{ 
    public DbSet<Page> Page { get; set; } 
    public DbSet<PageBackup> PageBackup { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Page>() 
      .Map(m => m.MapInheritedProperties().ToTable("Page")) 
      .HasKey(t => t.Id); 


     modelBuilder.Entity<PageBackup>() 
      .Map(m => m.MapInheritedProperties().ToTable("PageBackUp")) 
      .HasKey(t => new { t.PageId, t.Id }); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
関連する問題