Linq到扩展POCO实体的实体

时间:2015-05-19 16:13:23

标签: c# entity-framework entity-framework-5

我正在使用EF5并使用他们的代码生成器我生成了POCO类。以下是一个例子:

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

        void AddSchoolRanking()
        {
             ...
        }
    }

现在,凭借整个POCO概念,我相信您可以将它们用作业务对象,因此我计划在此类中添加一些自定义属性和方法。我这样做的方法是将它扩展到另一个.cs文件中,因为它是一个像下面的部分类

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

现在,以下查询返回“无法在LINQ to Entities查询中构造实体或复杂类型'Student'。”

laptops.json

当整个问题是能够在此类查询中无缝使用POCO以及解决此问题的正确方法时,出现此错误的原因是什么?

由于

1 个答案:

答案 0 :(得分:1)

EF会尝试将您的类的属性映射到源数据中的列。

如果使用不在数据源中的属性扩展类,则需要告知EF不要尝试通过添加[NotMapped]属性来映射它们:

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

    [NotMapped]
    public List<string> SchoolRankings;

    void AddSchoolRanking()
    {
         ...
    }
}

您也不应该在EF查询中创建 new 实体,而只是让EF进行创建和映射:

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

您可以将EF实体投影到其他非实体类类型,但这些实例与上下文没有任何关联(这意味着您无法将更改推送回数据库)。

请注意,我还将您的SchoolState字段更改为属性 - 通常不建议使用公共字段。