2015-05-19 65 views
0

我正在使用EF5並使用它們的代碼生成器,我得到了生成的POCO類。這裏是一個示例:Linq到擴展POCO實體上的實體

public partial class School 
    { 
     public School() 
     { 
      this.Students = new HashSet<Student>(); 
     } 

     public System.Guid Type { get; set; } 
     public int InternalID { get; set; } 

     public virtual ICollection<Student> Students { get; set; } 
    } 

現在,隨着整個POCO概念,我認爲這個想法是因爲你的業務對象,以及,所以我打算幾個自定義屬性和方法添加到這個類,你可以使用它們。我這樣做的方法是用另一種cs文件擴展,因爲它是像下面

public partial class School 
    { 
     public string SchoolState; 
     public List<string> SchoolRankings; 

     void AddSchoolRanking() 
     { 
      ... 
     } 
    } 

現在,下面的查詢返回的「實體或複雜類型「學生不能在LINQ來構建一個局部類到實體查詢「。

List<School> s = new List<School>(); 
using (SchoolContext ctxt = new SchoolContext()) 
{ 
     s = (from a in ctxt.Schools 
      where a.InternalID == id 
      select new School 
      { 
       ... 

      }).ToList(); 
} 

這是什麼錯誤背後的原因時,整點是要能夠無縫地使用POCO在這樣的查詢,什麼是正確的方式來解決這個問題?

謝謝

回答

1

EF會嘗試將您的類的屬性映射到源數據中的列。

如果你是不是在你的數據源屬性擴展類,你需要告訴EF不要試圖通過添加[NotMapped]屬性來將它們映射:

public partial class School 
{ 
    [NotMapped] 
    public string SchoolState {get; set;} 

    [NotMapped] 
    public List<string> SchoolRankings; 

    void AddSchoolRanking() 
    { 
     ... 
    } 
} 

你也應該不會產生實體在EF查詢,但只是讓EF做的創建和映射:

s = (from a in ctxt.Schools 
     where a.InternalID == id 
     select a).ToList(); 

你可以根據項目EF實體到其他非實體類的類型,但這些情況將有沒有聯繫上下文(意味着您不能將更改推回到數據庫)。

請注意,我也將您的SchoolState字段更改爲屬性 - 通常不鼓勵公共字段。