指向实体框架中同一个表的多个外键是不可区分的

时间:2014-04-24 23:51:27

标签: c# .net entity-framework

当两个或多个外键通过数据库上下文指向同一个表时,我无法区分外键。

例如,如果我有一个包含两个表的数据库,用户和发票。

Users has two fields: userId and userName
Invoices has three fields: invoiceNumber, cashierUserId, supervisorUserId

cashierUserId和supervisorUserId是指向Users表中userId的外键。

现在在实体框架中通过db上下文当我试图获得收银员或主管的用户名时,我无法告诉我将要获得哪个用户名。

dbContext.Invoices.Single(i => i.invoiceNumber == 1).Users.userName;

我可以获得哪个用户名?出纳员或主管?我怎么告诉它我想要哪一个?

1 个答案:

答案 0 :(得分:0)

首先,您的代码存在问题。 "用户"集合不会有名为" userName"的属性。它可能应该是:

dbContext.Invoices.Single(i => i.invoiceNumber == 1).Users.First().userName;

显然,第一个()不会有助于区分"问题。为此,我看到两个解决方案:

  1. 修改您的上下文,以便每个导航属性都有一个特殊名称(" Cashier"," Supervisor")。然后你会写:

    dbContext.Invoices.Single(i => i.invoiceNumber == 1).Cashier.userName;
    
  2. 为您的用户提供"类型"领域。这可以是存储在用户表中的字符串,也可能是外键到" UserTypes"表(在规范化数据库中)。然后您的查询变为:

    dbContext.Invoices.Single(i => i.invoiceNumber == 1).Users.First(u => u.UserType == "Cashier").userName;
    
  3. 使用不同的表会稍微改变谓词,但是你明白了。为了帮助指导您的设计,请记住EF与标准SQL没有什么不同。您将如何制作标准SQL查询来区分这两者?您可以将其基于外键(第一个选项)或用户表上的其他字段(第二个选项)。