2012-06-25 25 views
0

使用实体框架(4.3.1.0)处理项目。我试图弄清楚如何让我的代码作为一个事务工作,但对我来说,好像我的模型在事务失败后不会更新。实体框架 - 模型在事务失败后不会更新

让我告诉你:

using (TransactionScope trans = new TransactionScope()) 
{ 
    _database.Units.Add(new Unit{ ... }); 
    var a = false; 
    if (a) 
    { 
     trans.Complete(); 
     Refresh(); 
    } 
} 

Refresh(); 

我的经验是,TransactionScope的完成之后,它不回滚到之前的状态。当我运行刷新方法时,我循环遍历单元中的所有项目,并将值插入到一个ObservableCollection中,并将其显示在WPF窗口中的屏幕上。

这种机制适用于我成功执行事务的时候,但是当我运行上面的代码时,网格用新添加的单元进行更新,但是在事务之后运行Refresh之后它不会消失。

我有我做得fundamentaly错在这里:)

回答

2

实体框架不支持事务的内存跟踪实体的感觉 - 它的“ObjectStateManager”你在看ObjectContext的是不是一个事务资源。 TransactionScope只适用于在其中完成的数据库操作(查询,更新),而不是内存操作,比如操作对象图(这就是你所做的)。

+0

好的。这解释了很多。我能否以某种方式告诉EF我需要为全部或某些特殊表执行与数据库的同步?我的意思是,如果我可以刷新_database.Units表,这将是完美的。 – AndersLindas

+0

不是。在您的代码示例中,在回滚的情况下,您可以使用[OverwriteChanges](http://msdn.microsoft.com/zh-cn/library/system.data)分离新添加的实体并重新查询所有单元的数据库.objects.mergeoption.aspx)选项。 – cynic

+0

谢谢。我想我现在可以解决这个问题。另外,我使用Code First和DbContext代替ObjectContext。但是找到了有助于访问ObjectContext的[链接](http://thedatafarm.com/blog/data-access/accessing-objectcontext-features-from-ef-4-1-dbcontext/)。 – AndersLindas