实体框架错误 - 同时进行的数据库读取

4

我有一个MVC页面,从数据库中读取数据。此外,在页面上我有一些图片链接指向/MyController/Photo,这也会在数据库上进行一些读取操作。现在,浏览器"同时"获取照片,所以我注意到有些照片没有显示出来,我还记录了一些错误:

System.NullReferenceException Object reference not set to an instance of an object.
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean   openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
   at System.Data.EntityClient.EntityConnection.Open()
......

这是我的代码: 在视图中:
<img src="@Url.Action("Photo", "Profile", new { type = "listing", uID = f.uID })" />

在控制器操作中:
    public ActionResult Photo(string type, int uID)
    {
        User u = null;
        if (uID == 0)
            u = Repository.repository.GetUserByName(User.Identity.Name);
        else
            u = Repository.repository.GetUserByID(uID);

        if (u != null)
        {
        ...
        }
   }

我的问题是如何同步实体框架访问上下文,以确保我不会遇到这些错误?


你是否正在使用静态的数据上下文/存储库? - Peter Kiss
1个回答

0

我使用IoC/依赖注入和单例DatabaseFactory来实现这个功能,将其传递到每个存储库中。DatabaseFactory类保存了站点唯一的DbContext,这样就只有一个DbContext,不会出现任何奇怪的问题。我还将我的存储库注入到我的控制器中...我只是这样懒。

DatabaseFactory

public class DatabaseFactory : Disposable, IDatabaseFactory
{
    private CragDbContext _dataContext;
    private string _connectionString;

    public string ConnectionString
    {
        get { return _connectionString; }
        set { _connectionString = value; }
    }

    public DatabaseFactory(string connectionString)
    {
        if (connectionString == null) 
            throw new ArgumentNullException("connectionString");

        _connectionString = connectionString;
    }

    public CragDbContext Get()
    {
        if (string.IsNullOrEmpty(_connectionString))
            return _dataContext ?? (_dataContext = new CragDbContext());


        return _dataContext ?? (_dataContext = new CragDbContext(_connectionString));
    }

    protected override void DisposeCore()
    {
        if (_dataContext != null)
            _dataContext.Dispose();
    }
}

BaseRepository(所有我的存储库都继承自它)

public class BaseRepository<T> : IRepository<T> where T : BaseEntity
{
    protected CragDbContext DbContext;
    protected readonly IDbSet<T> DbSet;

    protected IDatabaseFactory DatabaseFactory { get; private set; }

    protected CragDbContext Context
    {
        get { return DbContext ?? (DbContext = DatabaseFactory.Get()); }
    }

    #region Ctor

    public BaseRepository(IDatabaseFactory databaseFactory)
    {
        if (databaseFactory == null) 
            throw new ArgumentNullException("databaseFactory");

        DatabaseFactory = databaseFactory;
        DbSet = Context.Set<T>();
    }

    #endregion

    public virtual void Add(T entity)
    {
        DbSet.Add(entity);
    }

    .... etc
}

实际上我中间有一个UnitOfWork类,但是你可以不用它。希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接