我有一个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();
但我得到一个例外异常“实体类型教师不是当前上下文中模型的一部分”。首先使用现有数据库代码时,是否还需要做其他工作?
答案 0 :(得分: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"));
...
}