エンティティタイプのプロパティをTPH継承を使用して複数のテーブルにマッピングするEF

user978139

私が使用したい(エンティティ分割)データベース内の複数テーブルへのエンティティタイプのマッピングのプロパティを同じ時間として使用しながら(TPH)の継承表ごとの階層のマッピング次のように、それゆえ私のモデルマッピングのコードは次のとおりです。

   modelBuilder
    .Entity<Person>()
    .HasKey(n => n.PersonId)
    .Map(map =>
    {
        map.Properties(p => new { p.Name });
        map.ToTable("dbo.Person");
    })
    .Map<Customer>(map =>
    {
        map.Requires("PersonType").HasValue("C");
        map.Properties(p => new { p.CustomerNumber });
        map.ToTable("dbo.Customer");
    });

次の基礎となるデータベーススキーマに基づいています。

create table dbo.Person
(
    PersonId int not null identity(1,1) primary key,
    PersonType char(1) not null,
    Name varchar(50) not null
)

create table dbo.Customer
(
    PersonId int not null references dbo.Person (PersonId),
    CustomerNumber varchar(10) not null
)

ただし、EFがクエリを実行しようとすると、次のようになります。

ctx.People.ToList();

次の例外メッセージがスローされます。

Invalid column name 'PersonType'.

SQLプロファイルを実行すると、ディスクリミネーターが実際に存在するテーブルではなくテーブルのPersonTypeC持つフィールド述語を使用しようとしているように見えますdbo.Customerdbo.Person

いずれかの機能、つまり継承のみまたは追加のテーブルマッピングのみを使用すると、機能しますが、要件の一部が失われます。

EF Fluent APIを使用して私が行っていることを実行できますか?

御時間ありがとうございます。

user978139

これは、マッピングに関係するすべてのテーブルスキーマのビューを作成することで実現できます。

create view dbo.vw_PersonExtended
as

    select
        p.Name, p.PersonId, p.PersonType, c.CustomerNumber
    from
        dbo.Person p
        left join dbo.Customer c on c.PersonId=p.PersonId

そして、このビューを基本クラスタイプにPersonマッピングし、次のように派生クラステーブルマッピングを削除します。

   modelBuilder
    .Entity<Person>()
    .HasKey(n => n.PersonId)
    .Map(map =>
    {
        map.Properties(p => new { p.Name });
        map.ToTable("dbo.vw_PersonExtended");
    })
    .Map<Customer>(map =>
    {
        map.Requires("PersonType").HasValue("C");
        map.Properties(p => new { p.CustomerNumber });
    });

ビューには複数のベーステーブルがあるため、これは新しいエンティティの挿入に失敗します。したがって、INSTEAD OF TRIGGERを使用するか、次のようにFluentコードを使用して挿入をストアドプロシージャにマップする必要があります。

    modelBuilder
        .Entity<Customer>()
        .MapToStoredProcedures(map => map.Insert(i => i.HasName("usp_InsertCustomer")));

そして、ストアドプロシージャの例を次のように挿入します。

create procedure dbo.usp_InsertCustomer
    @Name varchar(50),
    @CustomerNumber varchar(50)
as
begin

        set nocount on
        declare @id int

        insert into dbo.Person (Name, PersonType)
        values (@Name, 'C')
        set @id = scope_identity()

        insert into dbo.Customer (PersonId, CustomerNumber)
        values (@id, @CustomerNumber)

        select @id as PersonId

end

明らかに、このアプローチの欠点は、これを機能させるために必要なすべての配管作業です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

EF6のテーブル名を使用してエンティティとそのプロパティおよびタイプを取得する方法

分類Dev

ナビゲーションプロパティを使用して、マッピングテーブルを持つ2つのエンティティのデータを取得するにはどうすればよいですか?

分類Dev

別のプロパティの名前を使用して、EFエンティティプロパティを列にマップする必要があります

分類Dev

Ef Core 3エンティティタイプXOrderは、Orderから派生しているため、テーブルにマップできません。ベースエンティティタイプのみをテーブルにマップできます。

分類Dev

Hibernateを使用してエンティティをテーブルにマッピングする際のBeanCreationException

分類Dev

エンティティコア結合テーブルを使用したエンティティタイプのマッピング

分類Dev

複数のエンティティを1つのテーブルにマッピングする

分類Dev

EFコア:フィルターに一致するエンティティを取得しますが、複合キーによるグループ化で最新の日時プロパティを持つエンティティのみを取得します

分類Dev

同じタイプの複数のエンティティをマッピングするHibernate JPA

分類Dev

EntityFrameworkを使用してデータベース内のエンティティのハッシュテーブルプロパティを処理する方法

分類Dev

Graphx Scala:プロパティの継承を使用して頂点にフィルターを適用する

分類Dev

Symfony 2.7フォームエンティティタイプは、フォームに複数のプロパティをレンダリングします

分類Dev

継承されたエンティティのナビゲーションプロパティを取得する

分類Dev

修正に「いいえプロパティ[repositoryMethodは]タイプ[エンティティ]が見つかり!」方法 とき、私は継承されたエンティティのリポジトリを使用していますか?

分類Dev

1つのテーブルに対して複数のエンティティをマップするにはどうすればよいですか?

分類Dev

データベースのパフォーマンス:最大で1つのエンティティ/テーブルを使用します。可能なプロパティまたは異なるエンティティ/テーブルへの分割?

分類Dev

春データJDBCのテーブルにエンティティをマッピングする方法?

分類Dev

複数のソースプロパティを単一の宛先プロパティにマッピングする

分類Dev

EF6-基本クラスプロパティを使用した派生クラスでのTPH外部キーマッピング

分類Dev

EF6のすべてのプロパティのカスタムプロパティマッピングを作成します

分類Dev

EFTPT継承でエンティティのタイプを取得します

分類Dev

コードファーストとカスタムEntityTypeConfiguration実装を使用して、EF6のDB列に複合型のタイプのプロパティをマッピングします。

分類Dev

複数のクラス (同じエンティティですが、拡張されたプロパティを持つ) を同じデータベース テーブルにマップするにはどうすればよいですか?

分類Dev

継承ズーム(アクションプロパティ)をPDFファイルのブックマークに設定します

分類Dev

Symfony2の各エンティティのいくつかのプロパティのテーブルとしてエンティティフィールドタイプを表示する

分類Dev

GoogleDatastoreクエリのサブエンティティプロパティでエンティティをフィルタリングする

分類Dev

Hibernateを使用して共通のブリッジテーブルを介して3つのエンティティをマッピングする

分類Dev

EFコアの結合テーブルを使用して「自己階層」関係を持つエンティティをマップする方法

分類Dev

Automapper、単一の宛先プロパティを複数のソースプロパティの連結としてマッピング

Related 関連記事

  1. 1

    EF6のテーブル名を使用してエンティティとそのプロパティおよびタイプを取得する方法

  2. 2

    ナビゲーションプロパティを使用して、マッピングテーブルを持つ2つのエンティティのデータを取得するにはどうすればよいですか?

  3. 3

    別のプロパティの名前を使用して、EFエンティティプロパティを列にマップする必要があります

  4. 4

    Ef Core 3エンティティタイプXOrderは、Orderから派生しているため、テーブルにマップできません。ベースエンティティタイプのみをテーブルにマップできます。

  5. 5

    Hibernateを使用してエンティティをテーブルにマッピングする際のBeanCreationException

  6. 6

    エンティティコア結合テーブルを使用したエンティティタイプのマッピング

  7. 7

    複数のエンティティを1つのテーブルにマッピングする

  8. 8

    EFコア:フィルターに一致するエンティティを取得しますが、複合キーによるグループ化で最新の日時プロパティを持つエンティティのみを取得します

  9. 9

    同じタイプの複数のエンティティをマッピングするHibernate JPA

  10. 10

    EntityFrameworkを使用してデータベース内のエンティティのハッシュテーブルプロパティを処理する方法

  11. 11

    Graphx Scala:プロパティの継承を使用して頂点にフィルターを適用する

  12. 12

    Symfony 2.7フォームエンティティタイプは、フォームに複数のプロパティをレンダリングします

  13. 13

    継承されたエンティティのナビゲーションプロパティを取得する

  14. 14

    修正に「いいえプロパティ[repositoryMethodは]タイプ[エンティティ]が見つかり!」方法 とき、私は継承されたエンティティのリポジトリを使用していますか?

  15. 15

    1つのテーブルに対して複数のエンティティをマップするにはどうすればよいですか?

  16. 16

    データベースのパフォーマンス:最大で1つのエンティティ/テーブルを使用します。可能なプロパティまたは異なるエンティティ/テーブルへの分割?

  17. 17

    春データJDBCのテーブルにエンティティをマッピングする方法?

  18. 18

    複数のソースプロパティを単一の宛先プロパティにマッピングする

  19. 19

    EF6-基本クラスプロパティを使用した派生クラスでのTPH外部キーマッピング

  20. 20

    EF6のすべてのプロパティのカスタムプロパティマッピングを作成します

  21. 21

    EFTPT継承でエンティティのタイプを取得します

  22. 22

    コードファーストとカスタムEntityTypeConfiguration実装を使用して、EF6のDB列に複合型のタイプのプロパティをマッピングします。

  23. 23

    複数のクラス (同じエンティティですが、拡張されたプロパティを持つ) を同じデータベース テーブルにマップするにはどうすればよいですか?

  24. 24

    継承ズーム(アクションプロパティ)をPDFファイルのブックマークに設定します

  25. 25

    Symfony2の各エンティティのいくつかのプロパティのテーブルとしてエンティティフィールドタイプを表示する

  26. 26

    GoogleDatastoreクエリのサブエンティティプロパティでエンティティをフィルタリングする

  27. 27

    Hibernateを使用して共通のブリッジテーブルを介して3つのエンティティをマッピングする

  28. 28

    EFコアの結合テーブルを使用して「自己階層」関係を持つエンティティをマップする方法

  29. 29

    Automapper、単一の宛先プロパティを複数のソースプロパティの連結としてマッピング

ホットタグ

アーカイブ