2015-05-19 52 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字段更改为属性 - 通常不鼓励公共字段。