.Include()是如何工作的?

时间:2011-03-22 19:22:01

标签: asp.net asp.net-mvc linq linq-to-sql ef-code-first

您好我使用Visual Studio中的实体图创建了一个数据库,其中我添加了导航属性。我使用本教程http://geekswithblogs.net/danemorgridge/archive/2009/10/29/using-visual-studio-2010-beta-2-to-do-entity-framework.aspx创建了它 看起来像这样

User Table
IdUser    Name    IdAccount
1         Ron      2
2         Carl     1

导航属性:帐户(一对一关系)

Account table
IdAccount    Amount
1             50
2             30

导航属性:帐户(一对一关系 请注意,user1具有帐户2,user2具有帐户1

我做了:var user = infoDB.Users.Include("Account");

This displays:
Ron $50
Carl $30

这表明罗恩有50美元,这是账号1,这是错误的,因为罗恩有账号2 ......

为什么这不起作用?

我在几个表中遇到过这个,不一定idUser必须是IdAccount,这只是一个例子来说明问题..

有什么想法吗?我一直在研究这个我从头开始做数据库而IdAccount是Account表的外键,但它做的是同样的事情......

我在ASP mvc框架中这样做,就像来自音乐教程的查询一样,但它似乎与Genres.Include(“专辑”)一起工作正常它与它是一个事实有关一对一的关系?

3 个答案:

答案 0 :(得分:0)

我怀疑你在外键错误的时候从数据库中生成了EDMX,然后更新数据库以使其正确。

如果您检查导航属性的属性,它应该分解为字段/ FK级别,您将能够看到它。

如果删除edmx并从数据库重新创建,它应该按预期工作。

我们也可以通过查看edmx xml来确认这一点。

答案 1 :(得分:0)

我从您的other question开始关注此问题,我认为这是一个错误的外键关系问题。我的猜测是因为你的用户外键被称为Id,而EF期望Id成为主键。通常,用户上的外键是User.AccountId而不是User.Id

答案 2 :(得分:0)

来自here

  

Code First现在将推断出与主键具有相同数据类型的任何名为<navigation property name><primary key property name> (i.e. SubjectISBN)<principal class name><primary key property name>(即BookISBN)或<primary key property name>(即ISBN)的属性代表关系的外键。如果找到多个匹配,则按上面列出的顺序给出优先级。外键检测不区分大小写。

尝试围绕“AccountId”而不是“IdAccount”转换您的密钥名称。我的猜测是它使用IdUser作为用户&lt; - &gt;帐户关系的外键。