6

我在我的实体框架模型中看到了一个奇怪的行为。我有一个看起来像这样的查询:

var rows = ( from alarm in context.Alarms
             join temp  in context.ListDetails on alarm.ListDetailId equals  temp.ListDetailId into entries from entry in entries.DefaultIfEmpty()
             join read  in context.Reads       on alarm.ReadId       equals  read.ReadId
             join plate in context.Images      on alarm.ReadId       equals plate.ReadId
             where alarm.IActive == 1 && ! alarm.TransmittedAlarm 
             where  read.IActive == 1 
             where plate.IActive == 1 && plate.ImageTypeId == 2
             select new { alarm, entry, read, plate } ).ToArray();

查询按列名按字母顺序返回所有列。事实证明,对于结果集中的几行,该列为 NULL。当我在调试器中展开 rows 变量时,我看到整行都是空的!

编辑:一些澄清。

“第一列”是指第一行的第一列,即在“SELECT A, B, C FROM ...”中,我的意思是 A。碰巧实体框架构建的查询返回了所有连接结果集中的列按字母顺序排列,按字母顺序排列的第一个可以为空,并且对于某些行为空。

有问题的列不是主键;如果它是主键,则不能为空。

当 Entity Framework 将返回数据的行处理成对象时,它会查看每一行中第一列的值。如果该列为空,则返回该行的空值,而不是具有与该列对应的属性设置为空的对象。

我不相信这与左外连接有任何关系。碰巧我的查询使用了一个。但是,我还没有进行任何测试来验证这一点,所以这只是一个假设。

有人见过这个吗?有没有人可以解决这个问题?

托尼

4

2 回答 2

6

我可以确认我遇到了完全相同的问题:当 EF 形成的 SQL 查询null在结果的第一列中时,它返回 null 而不是实体。这意味着完全遵循:

using (var dc = new MyDbContext())
{
    var q = dc.Lands; //Lands is DbSet<Land>
    q = q.Where(criteria); //this leads to SQL query returning null in first column, confirmed by profiler
    var t = q.Single(); //t is now null
}

如果我们采用另一个标准,它不会导致null第一列,t是正常的非null实体。

在我看来,这是 EF 中某种晦涩的行为/错误。

更新

经过几个小时的探索,我发现了以下行为。EF 确实会返回null具有NULL结果第一列的实体(这会破坏预期的行为),但它有几个关于将哪一列放在选择列表中的概念。因此,在使我的模型与我的数据库状态完全一致之后(这意味着表示所有NULLABLE数据库列并用 替换required导航属性optional) - 我使用的是 Code First,所以有很多地方需要明确说明数据库- 我已经让它工作。

这意味着您应该针对您的数据库检查模型的商店级别定义(取决于您使用的范式,基于设计器还是基于代码,这将是不同的地方)。

于 2012-06-14T18:19:07.747 回答
1

DefaultIfEmpty在你的加入中使用。它的意思是

如果没有entries与连接条件 ( ) 匹配的项目,我希望您将类型( )alarm.ListDetailId equals temp.ListDetailId的单个默认值放入.ListDetailnullentries

在这种情况下,EF 生成一个LEFT JOIN. 事实上,这段代码是LEFT JOIN用 Linq2Sql 或 EF 生成的众所周知的方法。

如果表中没有行与条件匹配,则该LEFT JOIN语句选择NULL表中所有列的值JOIN。实际上,唯一重要的列是实体的 PK 列。EF 检查 PK 值是否为NULL,确定不存在实体并null放入entries。然后您将其null作为entry结果的属性值。

于 2012-04-18T16:19:18.737 回答