2013-10-24 26 views
0

我與我從來就沒想到到現在爲止一個問題所困擾.. 我試圖實現與EF代碼優先的應用程序與SQL CE數據庫。 我有給我具體的問題,這兩個主類:實體框架代碼優先Objecxt參考,但目前在數據庫

public class Session 
{ 
    public int Id { get; set; } 

    public Guid Unique { get; set; } 
    public DateTime DateTime { get; set; } 

    public virtual Patient Patient { get; set; } 
    public virtual Test Test { get; set; } 

    public virtual List<VideoExerciseResult> VideoSessionResults { get; set; } 
} 

public class VideoExerciseResult 
{ 
    public int Id { get; set; } 
    public Guid Unique { get; set; }   
    public string Word { get; set; } 
    public bool IsAnswerCorrect { get; set; } 

    public virtual Session Session { get; set; } 
} 

當我完成一個會話,並將結果保存EF我黑貂完成操作和節省會議並在數據庫上的結果。 我可以檢查直接在文件。自衛隊的看場,並在VideoExerciseResults列到SESSION_ID引用都存在。

但是,當在代碼中我儘量讓這個操作:

private void GetSessionData() 
    { 
     List<VideoExerciseResult> tempList2 = new List<VideoExerciseResult>(UOW.VideoSessionsResults.GetAll()); 
     ListOfVideoSessionResults = new ObservableCollection<VideoExerciseResult>((tempList2.Where(ver => ver.Session.Id == SelectedSession.Id)).ToList()); 
    } 

它給我的消息錯誤:未設置爲一個對象的實例

對象引用。

而事實上,如果tempList2一些videoexerciseresult對象的我鼠標懸停時有會話設置爲空,甚至認爲存在.sdf文件的值..

我錯過了什麼?


我將添加有關會議的代碼...... 它是基於一個知識庫和工作單元模式的我也跟着

public class EnPleinProjectUOW : IEnPleinProjectUOW, IDisposable 
{ 
    private EnPleinProjectDbContext DbContext { get; set; } 

    public IRepositoryProvider RepositoryProvider { get; set; } 

    public IVideoExerciseResultRepository VideoSessionsResults 
    { 
     get { return GetRepo<IVideoExerciseResultRepository>(); } 
    } 

    public IPatientRepository Patients 
    { 
     get { return GetRepo<IPatientRepository>(); } 
    } 

    public ISessionRepository Sessions 
    { 
     get { return GetRepo<ISessionRepository>(); } 
    } 

    public ITestRepository Tests 
    { 
     get { return GetRepo<ITestRepository>(); } 
    } 

    public IImageFileRepository ImageFiles 
    { 
     get { return GetRepo<IImageFileRepository>(); } 
    } 

    // We need inverse of control 
    public EnPleinProjectUOW(IRepositoryProvider repositoryProvider) 
    { 
     CreateDbcontext(); 

     repositoryProvider.DbContext = DbContext; 
     RepositoryProvider = repositoryProvider; 
    } 

    private void CreateDbcontext() 
    { 
     DbContext = new EnPleinProjectDbContext(); 

     DbContext.Configuration.ProxyCreationEnabled = false; 

     DbContext.Configuration.LazyLoadingEnabled = false; 

     DbContext.Configuration.ValidateOnSaveEnabled = false; 
    } 

    private IRepository<T> GetStandardRepo<T>() where T : class 
    { 
     return RepositoryProvider.GetRepositoryForEntityType<T>(); 
    } 
    private T GetRepo<T>() where T : class 
    { 
     return RepositoryProvider.GetRepository<T>(); 
    } 

    public void Commit() 
    { 
     DbContext.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if (DbContext != null) 
      { 
       DbContext.Dispose(); 
      } 
     } 
    }  
} 

這是一般的命令:

public class EnPleinProjectRepository<T> : IRepository<T> where T : class 
{ 
    #region Properties 

    protected DbContext DbContext { get; set; } 
    protected DbSet<T> DbSet { get; set; } 

    #endregion 

    #region Constructor 

    public EnPleinProjectRepository(DbContext dbContext) 
    { 
     if (dbContext == null) 
      throw new ArgumentNullException("Dbcontext missing"); 

     DbContext = dbContext; 
     DbSet = DbContext.Set<T>(); 

    } 

    #endregion 

    #region Methods 

    public IQueryable<T> GetAll() 
    { 
     return DbSet; 
    } 

    public T GetById(int id) 
    { 
     return DbSet.Find(id); 
    } 

    public void Add(T entity) 
    { 
     DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
     if (dbEntityEntry.State != System.Data.EntityState.Detached) 
      dbEntityEntry.State = System.Data.EntityState.Added; 
     else 
     { 
      DbSet.Add(entity); 
     } 
    } 

    public void Update(T entity) 
    { 
     DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
     if (dbEntityEntry.State == System.Data.EntityState.Detached) 
     { 
      DbSet.Attach(entity); 
     } 

     dbEntityEntry.State = System.Data.EntityState.Modified; 
    } 

    public void Delete(T entity) 
    { 
     DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
     if (dbEntityEntry.State != System.Data.EntityState.Deleted) 
     { 
      dbEntityEntry.State = System.Data.EntityState.Deleted; 
     } 
     else 
     { 
      DbSet.Attach(entity); 
      DbSet.Remove(entity); 
     } 
    } 

    public void Delete(int id) 
    { 
     var entity = GetById(id); 
     if (entity == null) return; 
     Delete(entity); 
    } 

    public void DeleteAll() 
    { 
     foreach (T entity in DbSet) 
      Delete(entity); 
    } 

但我」,非常有信心,這個工作,因爲在數據庫中的數據被保存,所有引用......我不知道爲什麼有些人不讀回...

謝謝你的答案

+0

我們不知道是什麼UOW.VideoSessionsResults.GetAll()呢,如果這應該返回Session屬性已滿的對象(就像在數據庫中一樣),那裏可能會出錯。你可以發佈該方法嗎?錯誤信息可能是由於一個事實,即會話未設置像你說的,所以檢查你的拉姆達Id屬性確實會引發異常,如果是空。因此,我們需要找出爲什麼會話屬性不會一直設置... – bump

+0

'ListOfVideoSessionResults'並不是指'List '? – Tico

+0

@Soner將粘貼在UOW.VideoSessionsResults.GetAll()方法的代碼? – Bellash

回答

0

我發現,在一行中做表達作品:

ListOfVideoSessionResults = new ObservableCollection<VideoExerciseResult>(UOW.VideoSessionsResults.GetAll().Where(vsr => vsr.Session.Id == SelectedSession.Id));