【问题标题】:Passing DbContext to other methods in the same class将 DbContext 传递给同一类中的其他方法
【发布时间】:2019-08-07 16:58:50
【问题描述】:

所以我有一个方法变得相当长,想把它扩展一下。从我想要分支的方法中,我想调用另一个方法并在那里完成涉及一些查找等的工作以及添加新实体。将 DbContext 从主要方法传递给其他方法的最佳方法是什么?参考还是不参考?

操作:登录

  MyLogCtx ctx = new MyLogCtx()
  var temp = context.Users.Where(m => m.user_unique_id ==1).FirstOrDefault();
  temp.timestamp = new DateTime();
  temp.AddLog("Login", ctx);


功能:添加日志

 // should I mark MyLogCtx as ref?
     public void AddLog(string activity, MyLogCtx context)
        {

            // want to add new log but in the original context, use ref?

            var log = new UserLog();
            log.user_id = this.user_id;
            log.activity = activity;
            context.UserLog.Add(log);
            context.SaveChanges(); 
        }

【问题讨论】:

  • 如果你在一个类中,你可以将数据上下文保存在一个私有变量中,一个类中的所有方法都可以访问它。因此,您的辅助方法可以是私有的并且位于同一个类中。如果它在不同的类中,则使用 DI 容器来实例化 DB Context 并将其注入到需要它的类中。

标签: entity-framework-core


【解决方案1】:

这很好:

public void AddLog(string activity, MyLogCtx context)

除非你想在 AddLog 中创建一个新的上下文,并将它传回给调用者,这不是你想要做的。

【讨论】:

  • 添加 ref 修饰符会有什么效果?
  • 在您的实现中,没有效果,但是将上下文设置为新值会将该值传递回调用者。
  • i如果您使用上述模式,那么您不必担心任何外部修改您的上下文,所有更改都将在复制的上下文范围内发生......如果您使用 ref 那么修改可能与对同一上下文的外部修改冲突。
  • 所以我可以在主方法和辅助方法中添加实体,但在主方法中调用保存更改,这两组更改都会反映在结果中?
  • @bitshift - 是的。
【解决方案2】:

您可以这样做,但这并不总是必要的。特别是。在同一个类中调用方法时。如果这个类是一个服务,那么通常的做法是它有一个上下文成员,该成员在其构造函数中传递给它,或者在那里创建,并在释放服务时释放。然后,当然,上下文在每个方法中都是可用的。

此外,当调用其他类中的方法时,并不总是需要传递上下文。如果您使用依赖注入,您可以定义一个范围,在该范围内所有类都接收相同的上下文实例。这是 ASP.Net core 中许多成熟应用程序和标准程序的标准。

让多个类在同一上下文中工作的另一种方法是使用ambient context scope,这是一个值得一读的链接,即使您不打算使用 DbContextScope。

即使上述情况之一适用,也可能存在您希望将上下文传递给方法的情况。当然这样做是完全有效的,但我会遵守两条经验法则:

  • 不要在它传入的方法中修改上下文。这是principle of least astonishment。含义:不要修改定义其行为的属性,例如延迟加载或验证。 当然不要替换它。修改其缓存的实体是可以的,通常甚至是有意的。这意味着您不会通过 ref 传递上下文。尽管在 c# 中每个引用类型都是由 ref 隐式传递的,但使用 ref 关键字表示 intention 在接收方法中修改对象。远离那个。
  • 不要在接收方法中保存更改。 EF 最佳实践的一部分是将上下文用作工作单元,这意味着:将上下文用于业务流程,调用一次SaveChanges,然后将其处理掉。大多数情况下,它应该是编排 UoW 的调用方法,因此应该调用 SaveChanges

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多