具有现有数据库表的Code First Generic Repository

时间:2012-11-20 16:17:17

标签: ef-code-first

我有一个Generic Repository类,首先使用代码来执行数据操作。

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

我在下面有以下代码,它将教师数据绑定到转发器控件。

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

但我得到一个例外异常“实体类型教师不是当前上下文中模型的一部分”。首先使用现有数据库代码时,是否还需要做其他工作?

1 个答案:

答案 0 :(得分:0)

您必须创建一个派生自DbContext的上下文类。该类应具有类型DbSet<T>的属性,这将为EF提供足够的信息,以使用默认命名和关联约定创建数据库并与之通信。它将使用Student.Teacher(如果有)之类的属性来推断外键关联:

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

如果默认值不是您想要的,或者您希望与模型中的名称和关联匹配的现有数据库,则可以执行两项(或三项)操作:

  • Override OnModelCreating手动配置映射。就像数据库中的表具有那些丑陋的前缀(提醒人们看到桌子时看到桌子):
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Teacher>()
                    .Map(e => e.ToTable("tblTeacher"));
        ...
    }
  • (不太理想)使用数据注释也可以这样做。
  • 转过来并使用Entity Framework Powertools将数据库反向工程为包含流畅映射和DbContext派生上下文的类模型。修改现有模型可能比从头开始更容易。