2015-12-02 49 views
0

使用代码优先,我怀疑如果通过查询数据库获取对象,但在从数据库中删除或删除对象后继续使用它,会发生什么情况。c# - 在实体框架中使用从上下文中删除的对象

例如,我进行该测试:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication12 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (TestDB db = new TestDB()) 
      { 
       Usuario myUser = db.Users.FirstOrDefault(); 

       if (myUser != null) 
       { 
        Console.WriteLine(myUser.Name); 
        db.Users.Remove(myUser); 
        db.SaveChanges(); 
        Console.WriteLine(myUser.Name); 
       } 
      } 
     } 
    } 
} 

测试工作,并且在同一myUser.Name被打印到控制台的两倍。由于默认情况下myUser是一个跟踪对象,我预计该程序会崩溃。但是,似乎所有值的对象在删除后仍然存在。 myUser实际上是否成为本地对象并停止被上下文跟踪?如果我通过函数返回这个被删除的实体并将它简单地存储为一个类属性,它会导致任何问题吗?

+0

从数据库中删除记录不会从内存中删除该对象。 – user1666620

+0

myUser ***是***本地对象,并且不知道它正在被跟踪。这一责任位于链条上方。 – spender

+0

值得一提的是,当你从数据库中检索一个对象时,你并不直接在数据库上工作,而是从内存中读取数据库中的对象。 –

回答

1

的对象仍然在内存中,但YPU要知道什么是它与DbContext关系:

你要检查什么是对象的状态:

DbEntityEntry entry = context.Entry(myUser); 
Console.WriteLine("myUser state: " + entry.State); 

运行此代码移除之前,保存更改后删除,这是entity lifecycle