0

私は Entity Framework の Code First を使用しようとしています。以下のコード行を書きました

DbContext _context = new  DbContext(ConfigurationManager.ConnectionStrings["con"].ConnectionString);

ただし、実行時には、接続は閉じたままです。このコードに何か問題がありますか??

以下に示す DBContext を使用して汎用リポジトリ クラスを作成しました。

public class GenericRepository<T> where T:class
  {   

public DbContext _context = new DbContext(ConfigurationManager.ConnectionStrings["con"].ConnectionString);

private DbSet<T> _dbset;

public DbSet<T> Dbset
{

    set { _dbset = _context.Set<T>(); }
    get { return _dbset; }

}

public IQueryable<T> GetAll()
{

    return Dbset;
}  
}

次に、ページ読み込みイベントでこのクラスを呼び出します。Teacher は、データベース内のテーブルにマップされるエンティティ クラスです。

protected void Page_Load(object sender, EventArgs e)
{
    GenericRepository<Teacher> studentrepository = new GenericRepository<Teacher>();
    rptSchoolData.DataSource = studentrepository.GetAll().ToList();
    rptSchoolData.DataBind();
}

しかし、接続は閉じられたままであり、コンテキスト オブジェクトの ServerVersion にも InvalidOperation 例外があります。

私は何かが欠けていますか??

4

1 に答える 1

0

このプロパティ

public DbSet<T> Dbset
{
    set { _dbset = _context.Set<T>(); }
    get { return _dbset; }
}

においがします。何もしないセッターvalueはアンチパターンの大事な時間です。DbSet作成後に設定する予定GenericRepositoryですか?

初期化しないため、コードが機能することすら理解できません_dbset。nullオブジェクト参照例外がスローされるはずです。

そもそもそこにあるべきではありません_dbset。を返す必要があります。EFは、接続をすべて単独で開閉する必要があります。DbSetを初期化しないと、接続が開かず、ここで明らかにされていない他のコードで問題が発生する可能性があります。DbSetGetAll_context.Set<T>()

于 2012-11-17T00:13:11.773 に答える