实体框架继承复合键

时间:2015-06-10 11:42:24

标签: entity-framework inheritance ef-code-first aggregation composition

以下是我的方案:我有三种实体类型,用户(ID,电子邮件,密码),志愿者(姓名,生日...)和 NonProfit (地址...)。志愿者和非营利者都是用户。

我能够创建三个表,如tbUser,tbVolunteer和tbNonProfit,其中用户拥有主键,志愿者和非营利组织拥有用户的主键/外键(UserID),但我不希望这样。

我的用户不是抽象类。首先,我将创建一个用户,例如Mary,我会说Mary是志愿者类型。下一刻,Mary将登录并完成注册,因此我将在数据库上创建一个志愿者行。

简而言之,我希望志愿者表具有UserID作为外键和VolunteerID(主键),以保持它等于我的工程图,志愿者和非营利组织是用户。我不想要聚合或组合,因为在我的UML志愿者中继承了用户。

我愿意接受建议,谢谢你们

1 个答案:

答案 0 :(得分:1)

实现此目的的正确方法是不要使用其他主键。实现如下:

public class User
{
    [Key]
    public int UserId { get; set; }

    public string Email{ get; set; }
    public string Password { get; set; }
}

[Table("Volunteer")]
public class Volunteer : User
{
    public DateTime BirthDate { get; set; }
}

[Table("NonProfit")]
public class NonProfit: User
{
    public string Address { get; set; }
}

public class MyContext: DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Volunteer> Volunteers { get; set; }
    public DbSet<NonProfit> NonProfits { get; set; }
}

有关详细信息,请查看此文章:http://www.codeproject.com/Articles/796521/Inheritance-in-Entity-Framework-Table-Per-Type