3

次のようなデータを含むレガシー データベース (変更できない) に 2 つのテーブルがあります。

2 つのレガシー テーブル

Table1 には複合主キー (Code、Abbrev) がありますが、Abbrev は識別子としても使用されます (以下を参照)。Table2 には 2 つの外部キー列 (CodeA、CodeB) があり、どちらも Table1 の同じフィールド Code を参照しています。Table1.Code フィールドに重複があります。

Entity Framework 6 で table-per-hierarchy アプローチを使用したいので、次のモデル クラスを作成しました。

[Table("Table1")]
public class MyBaseClass
{
    [Key]
    public string Code { get; set; }
}

public class MyBaseClassA : MyBaseClass
{
}

public class MyBaseClassB: MyBaseClass
{
}

[Table("Table2")]
public class SubClass
{
    [Key]
    public int Id { get; set; }

    [Required]
    [ForeignKey("MyBaseClassA")]
    public string CodeA { get; set; }

    public virtual MyBaseClassA ClassA { get; set; }

    [Required]
    [ForeignKey("MyBaseClassB")]
    public string CodeA { get; set; }

    public virtual MyBaseClassB ClassB { get; set; }

}

次のように、 DataContext : DbContext クラスで table-per-hierarchy を定義しました。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyBaseClass>().Map<MyBaseClassA>(m => m.Requires("Abbrev").HasValue("A"))
            .Map<MyBaseClassB>(m => m.Requires("Abbrev").HasValue("B"));
    }

問題は、そのようなマッピングを使用したい場合です - MyBaseClass の複合キーの一部として識別子フィールド (Table1.Abbrev) を使用できません - 次のエラーが発生します:

EntitySet 'DataContext.MyBaseClass' 内のすべてのオブジェクトには、一意の主キーが必要です。ただし、タイプ 'MyBaseClassA' のインスタンスとタイプ 'MyBaseClassB' のインスタンスはどちらも同じ主キー値 'EntitySet=MyBaseClass;Code=1' を持っています。

上記のモデルを Entity Framework 6 (またはそれ以降) にマップすることは可能ですか?

4

2 に答える 2

0

「Abbrev」列を主キーとする新しいテーブルを作成します。(このテーブルの例では、"Abbrev" 列の値が "A" と "B" の 2 つの行しかありません。) 次に、この新しいテーブルと既存の Table1 の間に外部キー関係を定義します。コードでは、既存の主キー定義の一部として "Abbrev" 列を追加して、Table1 の MyBaseClass を更新します。

これにより、MyBaseClass によって生成された「一意の主キーが必要です」というエラーが解決されます。

于 2015-02-12T18:16:51.467 に答える