asp.net - 在 ASP.NET 中管理 Entity Framework ObjectContext

标签 asp.net .net entity-framework ado.net objectcontext

我正在为 ASP.NET Web 窗体应用程序使用 Entity Framework ,我想知道我应该如何处理 ObjectContext这是一生。
例如,我有一个 InviteService管理邀请的类,例如创建和接受邀请。该类本身位于 Web 项目的另一个项目/命名空间中。
一个 InviteUsers()方法创建 Invite用户列表的实体,调用存储库将它们保存到数据库并向每个用户发送邀请链接。

Page 调用该方法当用户点击邀请按钮时。

我想知道我应该如何使用 ObjectContext

  • 实例化一个新的 ObjectContext在每个请求的页面上,将其作为参数传递给 InviteService 的构造函数类,然后将其丢弃在 Render 中方法。
  • 与上面相同,但不是通过构造函数设置它,而是将其作为参数传递给每个方法。
  • 创建一个单独的Objectcontext在每种方法中使用 using堵塞。

  • 根据 Ladislav 的回答,选项一在我看来是最好的:Entity Framework and Connection Pooling
    但是选项 3 似乎也有效,因为据我所知,由于连接池,没有建立新的数据库连接。

    最佳答案

    创建单个 ObjectContext 并不罕见。每个网络请求。我在我的 Web 应用程序中执行此操作。但是,IMO,该页面应该对 ObjectContext 一无所知。 .

    由于您已经在谈论在服务的构造函数中注入(inject)上下文,因此请看一下依赖注入(inject)(如果您还没有使用它)。当您使用依赖注入(inject)容器时,您可以让容器为您创建该服务并在该容器中注入(inject)对象上下文。您的页面唯一要做的就是从容器中请求该服务(理想情况下,您甚至可以将该服务注入(inject)该页面的构造函数中,但这对于 Web 表单是不可能的)。

    您的页面将如下所示:

    public class MyPage : Page
    {
        private readonly IMyService service;
    
        public MyPage()
        {
            this.service = Global.GetInstance<IMyService>();
        }
    
        protected void Btn1_OnClick(object s, EventArgs e)
        {
            this.service.DoYourThing(this.TextBox1.Text);
        }
    }
    

    在应用程序的启动路径(Global.asax)中,您可以像这样配置依赖注入(inject)框架:
    private static Container Container;
    
    public static T GetInstance<T>() where T : class
    {
        return container.GetInstance<T>();
    }
    
    void Application_Start(object sender, EventArgs e) 
    {
        var container = new Container();
    
        string connectionString = ConfigurationManager
            .ConnectionStrings["MyCon"].ConnectionString;
    
        // Allow the container to resolve your context and
        // tell it to create a single instance per request.
        container.RegisterPerWebRequest<MyContext>(() =>
            new MyContext(connectionString));
    
        // Tell the container to return a new instance of
        // MyRealService every time a IMyService is requested.
        // When MyContext is a constructor argument, it will
        // be injected into MyRealService.
        container.Register<IMyService, MyRealService>();
    
        Container = container;
    }
    

    在这些示例中,我使用了 Simple Injector依赖注入(inject)容器,尽管任何 DI 容器都可以。 RegisterPerWebRequest不是核心库的一部分,而是 is available as (NuGet) extension package .该软件包可确保您的 ObjectContext当 Web 请求结束时释放。

    起初这可能看起来很复杂,但这样网页就不必担心创建和处置 ObjectContext 的任何细节。 .

    此外,将执行用例的逻辑放在一个类中:一个命令。让命令(或系统)确保该操作的原子性。不要让页面对此负责,也不要在请求结束时提交,因为那时您将不知道调用 commit 是否可以。不,让命令自己处理。这里是 an article about writing business commands .

    这个建议也适用于 ASP.NET MVC,虽然你不应该调用 Global.GetInstance<IMyService>()在 Controller 的构造函数中,但只需使用构造函数注入(inject)(因为 MVC 对此有很好的支持)并使用 MVC3 Integration package .

    也看看this Stackoverflow question ,其中谈到在 IObjectContextFactory 之间进行选择或拥有 ObjectContext每个请求。

    关于asp.net - 在 ASP.NET 中管理 Entity Framework ObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8927779/

    相关文章:

    asp.net - 如何在页脚后的页面底部放置黑色

    c# - 在 session 中使用键/值集合

    c# - 从多对多关系中仅删除一个条目

    asp.net-mvc - Entity Framework DbSet.Find 抛出异常

    c# - Linq 的不同年月(对实体)

    asp.net - Bower_components 是否应该包含在项目中?

    asp.net成员(member)sitecore

    jquery - 没有表单标签的不引人注目的验证

    .net - 发布 .NET 项目时如何解决“不支持 'Could not open Source file: The given path' s 格式”错误?

    c# - 如何从 C# 调用 AllocateAndInitializeSid 函数?