0

単一のデータベース テーブルにマップする複数の小さいバージョンのクラスがあります。

例 UserBrief クラス:

[Table("Users")]
public partial class UserBrief
{   
    [Key]
    public int EmployeeID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; } 
}

UserAdmin クラス

[Table("Users")]
public partial class UserAdmin : UserBrief
{      
public int RoleID { get; set; }     
}

UserHR クラス

[Table("Users")]
public partial class UserHR : UserBrief
{      
    public string EmailAddress { get; set; }
    public string Phone { get; set; }     
}

ユーザー クラス

[Table("Users")]
public partial class User
{
    [Key]
    public int EmployeeID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int RoleID { get; set; }
    public string EmailAddress { get; set; }
    public string Phone { get; set; }
}

複数の境界付けられたコンテキストがあります。上記のクラスを使用したコンテキストの機能に応じて。

コンテキストに単一のクラスを追加し、他のすべてのクラスを無視すると、正常に機能します。

例えば

public DbSet<UserHR> UserHRs { get; set; }
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
    modelBuilder.Ignore<UserBrief>();
    modelBuilder.Ignore<UserAdmin >();
    modelBuilder.Ignore<User>();
}

UserBrief と UserHRs を追加すると、「無効な列名 'Discriminator'」というエラーが表示されます。これは、EF がこれを階層ごとのテーブル (TPH) アプローチであると想定しているためです。

解決策を探していますが、これを行う方法が見つかりません。

何か案は?前もって感謝します。

4

1 に答える 1

0

TPH アプローチの POCO オブジェクトで継承されたクラスは、プロパティ セクションだけでなく、クラスのサブタイプを表す必要があります。UserHR と UserAdmin の組み合わせである User テーブルを持つと、この表現が壊れます。

テーブルにDiscriminator プロパティを追加してエラーを修正することもできますが、null 許容プロパティを持つテーブルを使用するか、オブジェクトを 1 対 1 の関係としてモデル化するUserことをお勧めします。Users

public class UserBrief
{   
    [Key]
    public int EmployeeID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; } 

    public virtual UserAdmin UserAdmin { get; set; }
    public virtual UserHR UserHR { get; set; }
}

public class UserAdmin
{      
    [Key]
    [ForeignKey("UserBrief")]
    public int EmployeeID { get; set; }
    public int RoleID { get; set; }     

    public virtual UserBrief UserBrief{ get; set; }
}

public class UserHR
{      
    [Key]
    [ForeignKey("UserBrief")]
    public int EmployeeID { get; set; }
    public string EmailAddress { get; set; }
    public string Phone { get; set; }     

    public virtual UserBrief UserBrief{ get; set; }
}
于 2013-01-25T17:04:49.860 に答える