Entity framework 使用生成的POCO类将Linq转换为EF4中的实体
我使用ADO.NET C POCO实体生成器Visual Studio外接程序为我的实体生成POCO类 当我尝试在Linq to Entities查询中使用该类时,例如下面的查询: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
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中包含的类相同?或者他们是分开的班级?