0

今まで思いもよらなかった問題に苦しんでいます.SQL CE データベースを使用して EF Code First でアプリケーションを実装しようとしました。特定の問題を引き起こすこれら2つの主要なクラスがあります。

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 は操作を完了し、セッションと結果の両方をデータベースに保存できます。.sdf ファイルを直接見てフィールドを確認でき、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 にマウスを合わせると、.sdf ファイルに値があるにもかかわらず、いくつかの videoexerciseresult オブジェクトのセッションが null に設定されています。

私は何か見落としてますか?


セッションに関するコードを追加します...それは、私が従ったリポジトリと作業単位のスキーマに基づいています

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);
    }

しかし、データベースにはデータが保存され、すべての参照が保存されているため、これが機能すると確信しています...それらの一部が読み戻されない理由はわかりません...

回答ありがとうございます

4

1 に答える 1

0

式を 1 行で実行するとうまくいくことがわかりました。

ListOfVideoSessionResults = new ObservableCollection<VideoExerciseResult>(UOW.VideoSessionsResults.GetAll().Where(vsr => vsr.Session.Id == SelectedSession.Id));
于 2013-10-24T13:16:51.193 に答える