【问题标题】:Handling the context in Entity-framework在实体框架中处理上下文
【发布时间】:2009-11-06 19:14:37
【问题描述】:

我有一个为实体提供 CRUD 操作的类。我使用上下文作为类中所有方法可访问的私有成员。

  public class CustomerService
  { 
    private CeoPolandEntities context;

    public CustomerService()
    {
        context = new CeoPolandEntities();
    }


    public bool IsCustomerValid(string userName,string password)
    {
        Customer customer;

        customer = context.CustomerSet.FirstOrDefault(c => c.UserName == userName
                                                    && c.Password == password);

        return customer == null ? false : true;
    }

    public bool IsUserNameValid(string userName)
    {
        Customer customer;

        customer = context.CustomerSet.FirstOrDefault(c => c.UserName == userName);

        return customer == null ? true : false;
    }
}

这是对上下文的正确使用吗?它是线程安全和并发安全的吗??

它是一个 ASP.NET 应用程序。

【问题讨论】:

    标签: c# .net asp.net entity-framework


    【解决方案1】:

    只要您有不同的 CustomerService 实例来处理不同的请求,您就不必担心这一点。如果您碰巧有您自己创建的任何线程,请避免在同一实例中调用多个方法。

    【讨论】:

    • 所以如果我在一个实例中先调用 load 方法然后调用 save 方法,这很糟糕吗?为什么?
    • 不,我的意思是,如果你自己创建线程(而不是 asp.net 为请求创建的线程),那么它很糟糕,即它可能仍在加载时已经点击保存......更多常见的是你试图同时加载具有相同上下文实例的多个事物。完美的 k,在常规的 asp.net 请求期间使用相同的实例来加载内容和 l8r 保存。
    【解决方案2】:

    上下文不是线程安全的。

    如果满足以下条件,您当前的代码就可以了:

    1. 您更改 CustomerService 以处理上下文。
    2. 每个请求使用一个 CustomerService。

    【讨论】:

    • 在服务的基类或您的服务接口上实现 IDisposable 并在其中处理上下文清理,或者如果您希望每个请求都有一个上下文,您可以创建一个静态帮助器类,其方法是检查HttpContext.Current 用于上下文的实例,如果可用,请使用它,否则创建一个新的上下文并将其添加到当前上下文中。如果您还想要网络世界之外的功能,您可以考虑附加到当前线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多