具有OR逻辑的外键

时间:2017-10-02 11:53:29

标签: entity-framework database-design orm ef-code-first

我有这样的CodeFirst设计:

public class Email
{
    public string Address { get; set; }

    public Company Company { get; set; }
    public int? CompanyId { get; set; }

    public User User { get; set; }
    public int? UserId { get; set; }

    //many other props
}

public class Company
{
    public List<Email> Emails { get; set; }
}

public class User
{
    public List<Email> Emails { get; set; }
}

好的方式,电子邮件可以属于只有一个外键:CompanyId或UserId。但现在它允许CompanyId和UserId。这是错的。无论如何,那个带有nullables的设计是丑陋的。例如,要将所有电子邮件链接到我需要的公司,请执行以下操作:

var companyEmails = _context.Emails.Where(x => x.CompanyId.HasValue);

我觉得有一种更好的方法可以用OR逻辑定义多个外键。求你帮我找个方法。

1 个答案:

答案 0 :(得分:0)

如果您希望只有一个引用CompanyUser,则表示它不会是FK,而且您还应该有其他字段和说明,场点。

或者,您可以尝试每个层次结构表方法。在这种情况下,数据库表将保持几乎相同,只会隐式添加新的Discriminator列,以区分类,但您可以编写更多&#34; elegant&#34; 代码:

public abstract class Email
{
     public string Address { get; set; }
}

public class CompanyEmail : Email
{
    public Company Company { get; set; }
    public int? CompanyId { get; set; }
}

public class UserEmail : BaseEmail
{
    public User User { get; set; }
    public int? UserId { get; set; }
}

<强>用法:

var companyEmails = _context.Emails.OfType<CompanyEmail>();
//underlying query:
//select * from dbo.Emails where Discriminator = 'CompanyEmail'