0

最初にコードを使用してデータ操作を実行するGenericRepositoryクラスがあります。

public class GenericRepository<T> where T : class
{

public DbContext _context = new DbContext("name=con");

private DbSet<T> _dbset;

public DbSet<T> Dbset
{

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

}

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

} 

データベース内の既存のテーブル「Teacher」にまったく同じフィールドでマップするエンティティクラスTeacherがあります。

public class Teacher
{
public Teacher()
{
    //
    // TODO: Add constructor logic here
    //
}

public int TeacherID { get; set; }

public string FirstName { get; set; }

public string LastName { get; set; }

public int Age { get; set; }
}

以下のコードは、Teacherからのデータをリピーターコントロールにバインドします。

 GenericRepository<Teacher> studentrepository = new GenericRepository<Teacher>();
    rptSchoolData.DataSource = studentrepository.GetAll().ToList();
    rptSchoolData.DataBind();

しかし、「エンティティタイプTeacherは現在のコンテキストではモデルの一部ではありません」という例外例外が発生します。最初に既存のデータベースをコードに使用する場合、追加の作業を行う必要がありますか?

4

1 に答える 1

0

から派生するコンテキストクラスを作成する必要がありますDbContextDbSet<T>クラスには、デフォルトの命名規則と関連付け規則を使用してデータベースを作成および通信するのに十分な情報をEFに提供するタイプのプロパティが必要です。Student.Teacher(存在する場合)のようなプロパティを使用して、外部キーの関連付けを推測します。

public class MyContext: DbContext
{
    public DbSet<Teacher> Teachers { get; set; }
    public DbSet<Student> Students { get; set; }
    ...
}

デフォルトが希望どおりでない場合、またはモデル内の名前と関連付けと一致させたい既存のデータベースがある場合は、2つ(または3つ)のことを実行できます。

  • オーバーライドOnModelCreatingして、マッピングを手動で構成します。データベース内のテーブルにこれらの醜いプレフィックスが付いている場合のように(テーブルを見たときにテーブルが表示されることを人々に思い出させるため):
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Teacher>()
                    .Map(e => e.ToTable("tblTeacher"));
        ...
    }
  • (あまり好ましくない)同じことを行うには、データ注釈を使用します。
  • それを好転させ、 Entity Framework Powertoolsを使用して、データベースを流暢なマッピングとDbContextから派生したコンテキストを含むクラスモデルにリバースエンジニアリングします。おそらく、最初から始めるよりも、既存のモデルを変更する方が簡単です。
于 2012-11-20T18:12:11.077 に答える