0

我有多个较小版本的类映射到单个数据库表

例如 UserBrief 类:

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

用户管理类

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

用户HR类

[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 它会给出错误“无效的列名'鉴别器'”,因为 EF 假定这是按层次结构表 (TPH) 方法。

我一直在寻找解决方案,但找不到如何做到这一点。

有任何想法吗?提前致谢。

4

1 回答 1

0

TPH 方法的 POCO 对象中的继承类应该表示类的子类型,而不仅仅是属性部分。拥有由 UserHR 和 UserAdmin 组合而成的 User 表会破坏这种表示形式。

您可以尝试将鉴别器属性添加到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 回答