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

时间:2011-03-17 21:26:45

标签: linq entity-framework

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

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

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

我只是做这样的事情

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

我也在this question写了关于身份地图的文章。

答案 1 :(得分:0)

我建议您在EDM的designer.cs文件中搜索“警告”一词。它可能会告诉您实体框架是否与您的表有任何问题。

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

  1. 创建一个没有主键但在ID列上有唯一键的表。实体框架能够推断出主键,当我获取数据时,我不仅获得了正确的行数,而且还修正了这些行中的数据。
  2. 创建一个没有主键且没有唯一键的表。此外,没有名为ID的列。实体框架在生成的EDM中排除了此表。因此,我根本无法查询此表。这在EDM设计器文件中显示为警告。
  3. 如果您可以共享表的创建脚本,那会更好。