Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用生成的POCO类将Linq转换为EF4中的实体_Entity Framework - Fatal编程技术网

Entity framework 使用生成的POCO类将Linq转换为EF4中的实体

Entity framework 使用生成的POCO类将Linq转换为EF4中的实体,entity-framework,Entity Framework,我使用ADO.NET C POCO实体生成器Visual Studio外接程序为我的实体生成POCO类 当我尝试在Linq to Entities查询中使用该类时,例如下面的查询: var q = from w in entities.Widgets select new Widget { Id = w.Id, WidgetName = w.WidgetName, WidgetDescript

我使用ADO.NET C POCO实体生成器Visual Studio外接程序为我的实体生成POCO类

当我尝试在Linq to Entities查询中使用该类时,例如下面的查询:

var q = from w in entities.Widgets
        select new Widget
        {
            Id = w.Id,
            WidgetName = w.WidgetName,
            WidgetDescription = w.WidgetDescription
        };


return q.ToList();
我得到以下例外情况:

无法在LINQ to Entities查询中构造实体或复杂类型MyNamespace.Widget

解决此问题的唯一方法是使用匿名类型,然后使用另一个LINQ查询:

var q = from w in entities.Widgets
        select new
        {
            Id = w.Id,
            WidgetName = w.WidgetName,
            WidgetDescription = w.WidgetDescription
        };

var r = from e in q.AsEnumerable()
        select new Widget
        {
            Id = e.Id,
            WidgetName = e.WidgetName,
            WidgetDescription = e.WidgetDescription
        };

return r.ToList();
这是可行的,但相当多余。我明白为什么我会有例外,但有没有更优雅的方法

POCO类由ADO.NET C POCO实体生成器生成的事实似乎与问题无关;我尝试使用我自己的POCO类,发现了同样的异常

非常感谢

编辑: 添加了使用ADO.NET C POCO实体生成器Visual Studio加载项的演练链接-

这表明这是因为您正在实体框架范围外创建实体对象,这显然是不允许的。他们基本上使用与您相同的解决方法,在初始选择之后从匿名类型中双击结果

如果是我,我可能会通过简单地选择w并使用它来避免所有这些,或者创建一个新的特殊视图类型类来适应Widget的专业化。希望有比这更好的答案:

我猜MyNamespace.Widget是一个自定义类,而不是EDM的一部分

如果是这样,就不能将LINQ实体查询投影到自定义类型中。不管你是否使用POCO

你的想法是正确的,可以投射到匿名类型

在服务器上具体化查询后,您可以在客户端上塑造查询:

var widgets = entities
               .Widgets
               .ToList() // materialize query
               .Select(x => new Widget
                       {
                          Id = w.Id,
                          WidgetName = w.WidgetName,
                          WidgetDescription = w.WidgetDescription
                       }
               ).ToList();
这比你的解决方法好一点

但这回避了一个问题——为什么不首先在EDM上返回小部件类型


POCO的全部要点是,您可以将持久性逻辑划分为简单的类。所以我不确定你为什么要从一个简单的POCO类型投射到另一个看似相同的简单类型。您是否将您的POCO映射到N层传输的DTO?

RPM1984,除了EDM中已经创建的POCO之外,我不会创建新的POCO。ADO.NET C POCO实体生成器加载项将实体从ModelName.Designer.cs中取出,并为每个实体生成一个上下文类和一个单独的POCO。它还从类中删除了EdmEntityTypeAttribute属性,我想这会有效地从EDM中删除它们。忘记添加了,我确实打算从Azure中运行的REST服务返回列表,所以我将把它们映射到DTO。感谢您生成POCO之后,就不需要designer.cs文件了。也许这里发生了冲突。生成POCO后,是否将代码生成策略设置为“无”?您不应将designer.cs文件与POCO一起使用-仅EDMX。正确,designer.cs文件为空。对不起,如果我的评论不清楚的话。好的,很好。现在,选择new Widget是否与entities.Widgets中包含的类相同?或者他们是分开的班级?