我可以让EntityFramework 4.1返回返回结果的查询,这些结果会考虑DbSet.Local和数据库中的数据吗?

时间:2011-06-20 00:55:35

标签: entity-framework c#-4.0 .net-4.0 entity-framework-4.1

假设我在名为TestDB的数据库中有一个表,其中包含一个名为Table1的表,其中包含两列

ID
Name

在此表中,有两行

ID 1 and Name 'Row1'
ID 2 and Name 'Row2'

如果这是我的代码

var currObj = Table1.Where(o => o.Name.Contains("Row1")).FirstOrDefault();
currObj.Name = "Row1a";

var a = Table1.Where(o => o.Name.Contains("Row1a")).FirstOrDefault();
var b = Table1.Local.Where(o => o.Name.Contains("Row1a")).FirstOrDefault();

a将返回null,而b将返回一个值。

如果我这样做

var c = Table1.Where(o => o.Name.Contains("Row2")).FirstOrDefault();
var d = Table1.Local.Where(o => o.Name.Contains("Row2")).FirstOrDefault();

然后c会返回一些东西,但d不会。

对我来说,这似乎不直观,因为数据可能有两个不同的地方。对于我做的每个查询,我必须查看数据库和Local对象并将它们合并在一起。就像它在本地对象中被更改一样,我必须考虑到这一点。实体框架是否有任何机制,它会同时考虑数据库中的数据和本地数据?

所以,如果我去了

var e =  Table1.AMagicSolution.Where(o => o.Name.Contains("Row1a")).FirstOrDefault();
var f = Table1.AMagicSolution.Where(o => o.Name.Contains("Row2")).FirstOrDefault();

然后e和f都返回一些东西(f来自数据库,e来自Local对象)

2 个答案:

答案 0 :(得分:5)

你的期望有点奇怪。 EF上下文的工作方式类似于工作单元=它用于处理单个逻辑事务,因此您应该尝试以知道记录是否在本地存储中的方式设计应用程序。

如果由于任何原因您的应用程序不知道该记录是否在本地存储中,您应始终将查询分离到本地存储和数据库!原因是数据库的性能和不必要的往返。使用以下示例中的帮助程序首先查询本地存储,并且只有当本地存储查询数据库中不存在记录时才会:

public static Table1 AMagicSolution(this IQueryable<Table1> query, string name)
{
    var item = Table1.Local.Where(t => t.Name.Contains(name)).FirstOrDefault(); 
    if (item != null)
    {
        item = Table1.Where(t => t.Name.Contains(name)).FirstOrDefault();
    }

    return item;
} 

答案 1 :(得分:1)

与您的其他问题没什么不同。

Table1.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Unchanged)
    .Where(o => o.GetType() == typeof(Table1Type) 
           && o => o.Name.Contains("Row1a"))
    .FirstOrDefault();

docs:“EntityState是一个位字段,因此可以通过对多个EntityState值进行按位OR来检索多个状态的状态条目。”