2014-02-24 7 views
4

db에서 데이터를 읽는 MVC 페이지가 있습니다. 또한 페이지에서 일부 이미지 링크를/MyController/Photo 또한 db를 읽습니다. 이제 사진이 브라우저에 의해 반입되고있다 "동시에"그래서 나는 몇 장의 사진이 표시되지 않습니다 통지하고 또한 몇 가지 오류 로그 : 뷰에서 :엔티티 프레임 워크 오류 - 동시 db 읽기

다음
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) 
     { 
     ... 
     } 
    } 

내 질문은 어떻게 나는 이러한 오류를 얻을하지 않습니다 확인하기 위해 컨텍스트에 엔티티 프레임 워크에 대한 액세스를 동기화 할 수 있습니까?

+0

정적 데이터 인터페이스/저장소를 사용하고 있습니까? –

답변

0

IoC/Dependancy Injection과 각 저장소에 전달되는 Singleton DatabaseFactory를 사용하여이 작업을 수행합니다. DatabaseFactory 클래스는 사이트에 대한 유일한 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 (내 모든 respositories로부터 상속)

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에 클래스를 가지고 있지만, 당신은하지 않고 그것을 할 수 있습니다. 희망이 도움이됩니다.