当两个或多个外键通过数据库上下文指向同一个表时,我无法区分外键。
例如,如果我有一个包含两个表的数据库,用户和发票。
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;
我可以获得哪个用户名?出纳员或主管?我怎么告诉它我想要哪一个?
答案 0 :(得分:0)
首先,您的代码存在问题。 "用户"集合不会有名为" userName"的属性。它可能应该是:
dbContext.Invoices.Single(i => i.invoiceNumber == 1).Users.First().userName;
显然,第一个()不会有助于区分"问题。为此,我看到两个解决方案:
修改您的上下文,以便每个导航属性都有一个特殊名称(" Cashier"," Supervisor")。然后你会写:
dbContext.Invoices.Single(i => i.invoiceNumber == 1).Cashier.userName;
为您的用户提供"类型"领域。这可以是存储在用户表中的字符串,也可能是外键到" UserTypes"表(在规范化数据库中)。然后您的查询变为:
dbContext.Invoices.Single(i => i.invoiceNumber == 1).Users.First(u => u.UserType == "Cashier").userName;
使用不同的表会稍微改变谓词,但是你明白了。为了帮助指导您的设计,请记住EF与标准SQL没有什么不同。您将如何制作标准SQL查询来区分这两者?您可以将其基于外键(第一个选项)或用户表上的其他字段(第二个选项)。