1

这里是我的情况:我有三个实体类型,用户(ID,电子邮件,密码),志愿者(姓名,出生日期等)和非营利(地址...) 。志愿者和非盈利都是用户。实体框架继承复合键

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

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

简而言之,我希望志愿者表将UserID作为外键和VolunteerID(主键),以保持它等于我的工程图,其中志愿者和非营利组织是用户。因为在我的UML志愿者从用户身上继承,所以我不想要一个遗憾或者组合。

我开放的建议,感谢你们

+0

有你的'Volunteer'台独立的外交和主键将有效地使一个一对一很多关系,(用户可能是很多不同的志愿者)。我不确定你可以使用继承来实现这一点。 – user2697817

回答

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

+0

感谢您的回答和链接。我正走在这条路上。通过这种方式,我可以实现我想要的,现在我明白它是如何工作的。我只有一个问题。例如,我不是创建一个用户,而是在NonProfit上创建一个志愿者,它将自动创建用户。问题是志愿者稍后会提供他的个人资料,所以我必须提供空值,因为有些字段是必需的。 – Murilo

+0

正如你可以看到这个答案http://stackoverflow.com/questions/3823662/changing-inherited-types-in-entity-framework这是不可能开箱即用。您可以使用该问题的答案。另一种方法是在User实体中将所有附加字段设置为可选的,只需要一个类型枚举而不是真正的继承。 –

+0

是的,我读了提供的答案。他们谈论使用组合或存储过程。因为我想保留继承,所以我可能会使用存储过程来避免周围的工作,比如为Volunteer设置空值。因此,将创建用户“125”,然后当他填写剩余的数据时,我将通过存储过程创建志愿者“125”。谢谢 – Murilo