2012-11-20 58 views
0

我有一個通用Repository類,首先使用代碼來執行數據操作。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; 
} 

} 

我有一個實體類教師,它映射到我的數據庫中現有的表「教師」,具有完全相同的字段。

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

您必須創建一個從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派生上下文的類模型中。修改現有的模型比從頭開始可能更容易。
+0

我不明白爲什麼創建一個繼承自DbContext的MyContext類,當我已經在存儲庫類中創建了一個DbContext實例並且有一個指向我的數據庫的斷開字符串。我的理解是,只有當您需要代碼才能創建數據庫時,您才創建一個上下文類。 – RAHUL

+0

不,一個'DbContext'本身什麼都不知道,即使它有一個連接字符串。它如何知道在哪裏找到數據來實現「Teacher」?這不是在飛行中推斷它。假設它會。這可能需要很長時間才能成功,因爲數據庫和類模型之間存在精確的映射關係。這不是一個OR映射器的想法。 –

相關問題