0

我有一个通用存储库类,首先使用代码来执行数据操作。

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

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

4

1 回答 1

0

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

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

如果默认值不是您想要的,或者当您有一个想要与模型中的名称和关联匹配的现有数据库时,您可以做两(或三)件事:

  • 覆盖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 回答