EF5继承代码优先

时间:2013-01-25 14:23:43

标签: ef-code-first entity-framework-5

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

e.g 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 Class

[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; }
}

我有多个有界的背景。根据我上面使用的上下文的功能。

如果我在上下文中添加单个类并忽略所有其他类,那么它可以正常工作。

e.g

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)方法。

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

有什么想法吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

您可以尝试向User表添加一个Discriminator属性来修复错误,但我建议您只使用具有可空属性的Users表或将对象建模为1对 - 1关系:

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; }
}