是否有可能让Entity Framework识别已创建但尚未保存在数据库中的对象?

时间:2011-06-19 01:50:08

标签: c# .net linq entity-framework-4 linq-to-entities

Say Table1是一个包含两列的表。表1ID和名称。

如果我执行以下代码......

var Obj1 = new Table1();
Obj1.Name = "hello"
TestDBEntities.AddToTable1(Obj1);

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

currObj将返回null。

但如果我这样做

var Obj1 = new Table1();
Obj1.Name = "hello"
TestDBEntities.AddToTable1(Obj1);
**TestDBEntitles.SaveChanges();**

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

然后currObj将返回我创建的第一个对象。这是因为该对象在数据库中。

我正在创建一个大型批处理过程,我不希望将所有内容保存到数据库中直到最后。但是,我必须进行检查,例如确保尚未添加某个对象等,这些对象要求我在将这些对象保存到数据库之前引用它们。

是否可以在Entity Framework中进行LINQ查询,以便了解内存中尚未保存到数据库的对象。

3 个答案:

答案 0 :(得分:6)

我在这里有点晚了... @DavidWicks的回答并不能说明整个故事!

上下文确实提供了一种查询机制 - 它在EF4.1中比4.0

更容易

在4.1中查看http://msdn.microsoft.com/en-us/library/gg696248(v=vs.103).aspx dbSet.Local属性保存上下文中对象(尚未删除)的所有本地更改,因此只需查询即可!

答案 1 :(得分:3)

将创建和未保存的对象添加到List<T>,然后像上面一样使用linq过滤该列表。

编辑:实际上,我的立场得到了纠正。看起来您可以在ObjectContext上指定合并选项。

TestDBEntities.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
    .Where(o => o.GetType() == typeof(Object1Type) 
           && o => o.Name.Contains("hello"))
    .FirstOrDefault();

docs

答案 2 :(得分:0)

这只是你需要做的事情:

    Datacontext.YourTable.Add(entity);
    var x=Datacontext.YourTable.Local;

使用.Local获取实体dbset的本地状态:)