使用实体框架,首选方式?

Pet*_*lin 6 c# design-patterns entity-framework coding-style

假设我们已经创建了实体模型,使用它的首选方法是什么?我个人无法下定决心..

  1. 使用ModelAdapter:

    public stati? Product[] GetProducts()
    {
            using(Entities ctx = new Entities())
            {
                    return ctx.Product.ToArray();
            }
    }
    
    
    
    Product[] ps = ModelAdapter.GetProducts();
    // ...
    ModelAdapter.UpdateProduct(p);
    
    Run Code Online (Sandbox Code Playgroud)
    • 看起来整洁;
    • 但是,有时会创建/释放上下文,对象与上下文失去联系;
  2. 使用上下文:

    using(Entities ctx = new Entities())
    {
            Product[] ps = ctx.Product.ToArray();
    
            // ...
    
            ctx.SaveChanges();
    }
    
    Run Code Online (Sandbox Code Playgroud)
    • 有效
    • 但是,代码变得混乱
  3. 混合模式,折衷?

  4. 扩展方法:

    using(Entities ctx = new Entities())
    {
        Product[] ps = ctx.GetProducts();
        // ...
        ctx.UpdateProduct(p);
    }
    
    Run Code Online (Sandbox Code Playgroud)

实际上现在,我正在尝试方法#4,实现实用程序方法作为上下文的扩展.所以我可以使用一个上下文,并对这个上下文进行多次调用.

Lee*_*unn 6

在开发Web应用程序时,我一直在使用根据Web请求创建的共享上下文.然后,您可以使用"ModelAdapter"方法并保留封装,但仍然可以在相同的上下文中运行.我经常使用它并且没有遇到任何问题.

  • 每个请求的上下文是一个很好的方法,除非你有其他令人信服的理由.它使设计在逻辑上保持简单 - 请求和EF上下文的1:1. (3认同)

Lad*_*nka 2

通常使用适合您的需求、可维护且适合您的应用程序复杂性的任何内容。您应该考虑以下几点:

  • 切勿在请求之间共享上下文,而是根据您的需要为每个请求、每个操作或每个方法使用上下文。
  • 如果您想对应用程序进行单元测试,您会发现静态方法有时扩展方法也可能是一个问题。但使用 EF 测试应用程序是一个单独的问题
  • 如果您想在单个工作单元中修改或插入更多项目,您会发现每个方法的上下文并不是您所需要的
  • 许多开发人员喜欢使用存储库模式将对 EF 功能的访问与应用程序的其余部分分开。它有其自身的优点和缺点