Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 我能获得EntyTrrices 4.1返回返回在DbStase.Load和数据库中考虑数据的结果的查询吗?_Entity Framework_C# 4.0_.net 4.0_Entity Framework 4.1 - Fatal编程技术网

Entity framework 我能获得EntyTrrices 4.1返回返回在DbStase.Load和数据库中考虑数据的结果的查询吗?

Entity framework 我能获得EntyTrrices 4.1返回返回在DbStase.Load和数据库中考虑数据的结果的查询吗?,entity-framework,c#-4.0,.net-4.0,entity-framework-4.1,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.Nam

假设我在一个名为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不会

对我来说,这似乎不直观,因为数据可能位于两个不同的位置。对于我执行的每个查询,我都必须查看数据库和本地对象,并将它们合并在一起。比如,如果它在本地对象中发生了更改,我必须考虑到这一点。实体框架是否有这样的机制,既考虑数据库中的数据又考虑本地数据? 所以如果我去

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来自本地对象)

与您的另一个问题没有太大区别

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

“EntityState是一个位字段,因此可以通过按位或多个EntityState值在一次调用中检索多个状态的状态条目。”

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

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

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;
} 
publicstatictable1amagicsolution(此IQueryable查询,字符串名称)
{
var item=Table1.Local.Where(t=>t.Name.Contains(Name)).FirstOrDefault();
如果(项!=null)
{
item=Table1.Where(t=>t.Name.Contains(Name)).FirstOrDefault();
}
退货项目;
} 

mmm目前无法测试,我回来后会测试。如果我还将EntityState.Modified添加到此,那么对于更改的行,我将得到哪一行?它将获得数据库中的原始数据还是更改后的数据?您将获得修改后的未保存值。不幸的是,我的Entities类现在是DbContext,因此我无法运行它,我想我可能可以使用ChangeTracker实现相同类型的功能。谢谢,这比其他解决方案好一点,虽然现在性能不是我的问题。关于这个解决方案,我唯一想说的是,我希望它更通用。我需要为每个查询的每个类编写一个特定的方法。如果您可以将一个DbSet作为表传递,并将希望作为func在其上运行的linq查询传递给它,那就太好了。但是我已经尝试过了,不幸的是,我认为这是不可能的。我猜上面的代码应该是:if(item==null)而不是if(item!=null)