2011-06-20 81 views
3

说我有一个表在一个名为testdb的一个名为Table 1表中包含两列我可以让EntityFramework 4.1返回返回考虑DbSet.Local和数据库中的数据的结果的查询吗?

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)东西

回答

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; 
} 
+0

谢谢,这是比其他解决方案稍好一点,虽然性能不是一个问题在这个时候。我只想说这个解决方案,但我希望它更通用。我需要为每个查询的每个类编写一个特定的方法。如果你可以通过一个DbSet 作为表,并且你想在其上运行的linq查询作为一个func,那将是非常好的。但我已经玩过它了,可悲的是,我不认为这是可能的。 – Diskdrive

+3

我猜上面的代码应该是:if(item == null)而不是if(item!= null) – NoChance

1

没有太大的不同,从您的其他问题。

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

docs道:“EntityState是位字段,所以用于多个状态的状态项可以在一个呼叫被多于一个EntityState值做逐位OR检索”。

+0

MMM目前不能对此进行测试,当我回来的,将考验。如果我还将EntityState.Modified添加到此,我将获得更改的行的哪一行?它会像原始数据一样获取原始数据还是更改过的数据? – Diskdrive

+0

你会得到修改的未保存的值。 –

+0

不幸的是,我的实体类现在是一个DbContext,所以我不能运行它,我想我可以使用ChangeTracker来实现相同类型的东西。 – Diskdrive

相关问题