实体框架关系未返回所有结果

时间:2016-06-08 16:15:38

标签: c# entity-framework

我已经删除了.edmx并重新创建了多次!

问题是,只有部分ProductAttributes(仅针对某些产品而非全部产品)在以下代码中返回:

   var p = context.Products.FirstOrDefault(x => x.ProductNumber.Equals(productSku));x.ProductNumber.Equals(productSku));
            foreach (var attr in p.ProductAttributes)
            {
              //only prints some results
            }

以下工作正常:

   var p = context.Products.FirstOrDefault(x => x.ProductNumber.Equals(productSku));
            var pAttrs = context.ProductAttributes.Where(x => x.ProductNumber.Equals(productSku));
            foreach (var attr in pAttrs)
            {
               //prints all of the results
            }

为了确保我在这里设置正确的关系是一些屏幕截图:

enter image description here

enter image description here enter image description here

修改

我确实从没有产品的ProductAttribute中删除了一两个产品,我初步意识到数据库迁移后没有一致性。所以我试图通过消除没有产品的ProductAttributes来清理数据。然后将关系置于游戏中,将现有数据集检查为是。

我目前只对两个表运行了以下查询。 ProductAttribute和Product,

  SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

如果产品表中没有ProductNumber参考的任何ProductAttributes,则查找(如果T1是productAttribute)。并返回0行。我认为这意味着ProductAttribute表没有没有出现在Product中的ProductNumbers。

2 个答案:

答案 0 :(得分:0)

ProductAttributes

中加入Product

添加以下参考

using System.Data.Entity

并且

var p = context.Products.Include(p => p.ProductAttributes).FirstOrDefault(x => x.ProductNumber.Equals(productSku));

修改

这可能是您删除了一些产品并且没有删除productattributes或者数据库中存在不一致的情况。因此,您必须设置特定于Cascade

的插入和更新

如果删除该产品,这将删除一个产品的ProductAttributes

答案 1 :(得分:0)

如果您使用的是EF:

默认情况下,EF使用延迟绑定,在您明确指定之前,不会从数据库中检索ProductAttributes。 所以试试这个:

var p = context.Products.Include(x => x.ProductAttributes).FirstOrDefault(x => x.ProductNumber.Equals(productSku));
foreach (var attr in p.ProductAttributes)
{
    // This should print out all data
}