【问题标题】:entity framework returning only one value but the list size is correct实体框架只返回一个值但列表大小正确
【发布时间】:2011-03-17 21:26:45
【问题描述】:

实体框架只返回一个值但列表大小正确

我有一个没有主 ID 的表,我需要获取或选择其中的所有值。

我看到的是,当我使用 linq 进行选择时,对象的数量是正确的,但它是第一行一遍又一遍。

我只是在做这样的事情

List<MyValueType> valuesInDB = myDb.MyValueTypes.ToList();

问题是我可能会得到数千行(这是正确的),但这些行都有相同的确切数据。

我正在使用 VS 2010 并使用向导创建我的 EF 对象。

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    问题是实体框架无法在没有密钥的情况下使用实体。所以如果你的表没有指定一个键,entity framework will infer 它自己的。 EF 创建的键由所有不可为空的非二进制列组成。

    因此,例如,如果您的实体中有一个不可为空的列,该列只有非常小的一组值(如枚举),您将只能“按值”加载单个实体。原因是上下文的内部实现和使用身份映射模式的状态管理器。当从数据库中检索数据记录时,EF 将首先检查实体键并尝试在其内部存储中查找具有相同键的对象。如果找到一个对象,它将使用该对象而不是检索到的数据记录(尽管有不同的数据)。如果未找到具有该键的对象,则会物化一个新对象并将其添加到内部存储中。

    这就是身份映射的目的 - 每个上下文只应创建一次具有给定键的对象。身份映射是 ORM 中的核心模式。

    我也在 this question 中写过关于身份映射的文章。

    【讨论】:

    • 非常有趣。感谢您的洞察力。
    • 这是一个没有密钥的数据库。所以这听起来是个问题。奇怪的是它会以这种方式工作。
    【解决方案2】:

    我建议在您的 EDM 的 Designer.cs 文件中搜索“警告”一词。它可能会告诉您 Entity Framework 是否对您的表有任何问题。

    在没有桌子设计的情况下,我真的无法评论太多。我尝试复制您的问题,但无法这样做。这是我所做的:

    1. 创建了一个没有主键但在 ID 列上有唯一键的表。 Entity Framework 能够推断出主键,当我获取数据时,我不仅获得了正确的行数,而且还获得了这些行中的正确数据。
    2. 创建了一个没有主键和唯一键的表。也没有名为 ID 的列。实体框架在生成的 EDM 中排除了此表。因此,我根本无法查询此表。这在 EDM 设计器文件中显示为警告。

    如果您可以共享表的创建脚本会更好。

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多