实体框架中的僵尸对象

时间:2011-06-18 16:19:44

标签: c# .net wpf entity-framework

我在Entity Framework中创建了几个实体。它们会自动添加。

问题1: MyEntity.CreateMyEntity自动将实体添加到上下文中是否正常?

现在,我想要保存它们,但是如果它们违反了数据库约束,我会得到异常,没有任何内容持续存在 - 正确,但是 - 这些对象保留在我不想要的ObjectContext中。

我尝试将代码运行为:

using (var t = new TransactionScope()) {
   ...create entities...
   try
   {
     context.SaveChanges();
     t.Complete();
     context.AcceptAllChanges();
   }
   catch
   {
      MessageBox.Show("Ooops");
   }
}

但即使我在事务中运行它,这些实体仍保留在上下文中。

问题2:我错过了什么?我必须手动删除它们吗?

3 个答案:

答案 0 :(得分:1)

避免不需要的对象而不必处理上下文的另一个选择是在使用Detach()将更改提交到数据库后手动分离它们:

  

您可以从对象中分离对象   他们不再是上下文   需要。为此,请调用Detach   方法。这减少了   使用的记忆。

context.Detach(yourEntity);

请注意相关实体,如果您的实体有相关对象,相关实体将不会自动分离。

答案 1 :(得分:0)

在删除这些更改之前,所有更改都将保留在上下文中。不成功的保存不会取消更改。 CreateMyEntity是什么意思?当您使用AddObject或在已添加的实体中引用更改时,更改将添加到上下文中。

答案 2 :(得分:0)

如果出现问题(例外) - 你必须处理上下文(因为它已经错了)并重新开始:创建新的datacontext,获取所需的数据,创建新的实体等......

P.S。:或者您可以修复问题并保存上下文。