Mae*_*024 4 linq entity-framework
实体框架只返回一个值但列表大小正确
我有一个没有主要ID的表,我需要获取或选择其中的所有值.
我所看到的是,当我使用linq进行选择时,对象的数量是正确的,但它是第一行一遍又一遍.
我只是做这样的事情
List<MyValueType> valuesInDB = myDb.MyValueTypes.ToList();
Run Code Online (Sandbox Code Playgroud)
问题是我可能会获得数千行(这是正确的),但行都具有相同的确切数据.
我正在使用VS 2010并使用向导来创建我的EF对象.
问题是实体框架无法在没有密钥的情况下使用实体.因此,如果您的表没有指定密钥,实体框架将推断自己的密钥.EF创建的密钥由所有不可为空的非二进制列组成.
因此,如果您在实体中具有单个非可空列,其中只有非常小的值集(例如枚举),则您将只能加载单个实体"每个值".原因是上下文的内部实现和使用Identity map模式的状态管理器.从数据库中检索数据记录时,EF将首先检查实体密钥并尝试在其内部存储中查找具有相同密钥的对象.如果找到一个对象,它将使用该对象而不是检索的数据记录(尽管数据不同).如果找不到具有密钥的对象,则实现新对象并将其添加到内部存储.
这就是身份映射的目的 - 具有给定键的对象应该只由每个上下文创建一次.身份映射是ORM中的核心模式.
我也在这个问题上写了关于身份地图的文章.
| 归档时间: |
|
| 查看次数: |
2645 次 |
| 最近记录: |