我有这样的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逻辑定义多个外键。求你帮我找个方法。
答案 0 :(得分:0)
如果您希望只有一个引用Company
或User
,则表示它不会是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'