在LINQ查询中使用导航属性会导致诸如关系多样性之类的问题

时间:2012-03-27 04:22:35

标签: c# linq

当我执行诸如以下的查询时:

_domainContext.Users
    .Where(u => u.Id == _userContext.User.Id)
    .SelectMany(u => u.Houses)
    ... // more query stuff here

我没有问题。

但是当我这样做时:

_domainContext.Users
    .Where(u => u.Id == _userContext.User.Id)
    .First()
    .Houses
    ... // more query stuff here
发生

错误,例如

  

发生了关系多重性约束违规:An   EntityReference只能有一个相关的对象,但是   查询返回了多个相关对象。

与//中更多查询内容中的内容相关我认为。有人可以解释这两者之间的区别是什么以及为什么会导致问题?

1 个答案:

答案 0 :(得分:0)

我不是百分百肯定,但我对这个问题有所了解。它很可能与您的实体映射更相关(我假设这是一个EF项目)。如果您尝试在第一个查询中实际访问.Houses属性,则可能会收到相同的错误。只是第一个实际上没有加载Houses(这可以通过运行SQL跟踪并查看每个查询中调用的SQL来验证)。

我猜你在哪里有代码就是这样的?

modelBuilder.Entity<User>()
        .HasRequired(t => t.Houses)
        .WithOptional()               
        .Map(c => c.MapKey("HouseId"));

如果这是正确的,您需要将.WithOptional()更改为.WithMany()。此映射不适用于此处似乎发生的1对多关系。如果这不正确,请你至少发布你的模型映射,并且生成的SQL也可能很好。