【问题标题】:C# Entity Framework: Check & Execute Logic (Multiple users)C# 实体框架:检查和执行逻辑(多用户)
【发布时间】:2016-04-28 14:10:28
【问题描述】:

我已经使用实体框架设计了一个 WPF 应用程序来实现数据持久性。与数据库的所有交互都是通过实体框架基础架构完成的。

我想检查特定实体的布尔属性,如果它为假,则针对该实体和相关实体执行一些逻辑。但是,该应用程序是在多用户环境中使用的,因此代码可能会通过检查(即布尔属性可以为假),但另一个用户可以拦截并且只会保存最新用户的更改(根据乐观并发)。

如何将检查和对实体和相关实体的更新打包,以便执行所有代码或不执行任何代码?我知道交易可能是解决这个问题的方法?如果是这样,这些在 Entity Framework 中是如何实现的?

谢谢!

【问题讨论】:

  • 是否可以在执行其余逻辑之前更新决定属性?

标签: c# wpf entity-framework concurrency


【解决方案1】:
using (var context = new YourContext()) 
            { 
                using (var dbContextTransaction = context.Database.BeginTransaction()) 
                { 
                    try 
                    { 
                      //Your logic here
                        context.SaveChanges(); 

                        dbContextTransaction.Commit(); 
                    } 
                    catch (Exception) 
                    { 
                        dbContextTransaction.Rollback(); 
                    } 
                } 
            } 

【讨论】:

  • 这可以解决问题,非常感谢!在我标记为已接受的答案之前,我发现了一些有趣的行为。当我在事务中间设置断点以故意制造冲突时,其他用户将在 context.SaveChanges() 上“挂起”,直到服务器超时。我不想弄乱当前的超时限制。是否有一些策略可以确定交易已经到位并取消/移出 context.SaveChanges() 用于体验“挂起”的用户?
  • 我不太理解你,但是你可以在交易对象上检查一下 if (Transaction.Current.TransactionInformation.Status == TransactionStatus.Committed) { // do redirect }
  • 对不起,我将查看交易对象并找出如何做到这一点
  • 在方法的开头尝试一个布尔值,在事务提交时切换它的值。有了这个,您可以使用布尔值作为继续或不继续的标志。让我知道这是否有帮助
猜你喜欢
  • 2013-09-14
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
相关资源
最近更新 更多