使用EF4的POCO模板时“找不到元数据信息”?

efpocoadapter entity-framework poco

我刚安装了EF4的POCO模板。我的模型中有一个实体, AnnouncementText ,并且T4文件似乎正确生成。当我访问自动生成的属性MyObjectContext.AnnouncementTexts时,尝试访问此新实体会引发以下错误:

InvalidOperationException:无法找到EntityType'MyNamespace.AnnouncementText'的映射和元数据信息。

AnnouncementText POCO上的属性似乎与数据库中的列匹配,并且我没有更改任何自动生成的代码。

堆栈跟踪是:

   at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)
   at System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName)
   at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity](String entitySetName)
   at MyNamespace.MyObjectContext.get_AnnouncementTexts() in C:\<snip>\MyObjectContext.Context.cs:line 65
   at MyNamespace.Class1.Main() in C:\<snip>\Class1.cs:line 14

如果我从解决方案中删除.tt文件并在模型上启用代码生成,我可以毫无问题地访问该属性。

这是我的代码,如果可能有帮助:

using (var context = new MyObjectContext())
   foreach (var at in context.AnnouncementTexts)
      Console.WriteLine(at.Title);

关于可能出错的任何想法?

一般承认的答案

我最近在将EDMX文件移动到解决方案中的新位置时再次遇到了同样的错误。显然,处理EDMX文件时有几个不同的命名空间。在创建初始EDMX文件(N1)时,通过向导输入了命名空间,SSDL中显示的另一个文件看起来像这样(N2):

<Schema Namespace="..." ..

然后是生成代码的命名空间,可以(可选)在设计器(N3)中指定,最后是编译到最终程序集(N4)中的资源的隐藏名称空间。

据我所知,命名空间N2只与SSDL内部真正相关。我相信这个命名空间以N1开始 - 你最初在向导中输入的那个。

类似地,名称空间N3仅与C#名称空间的方式相关。

这是有问题的部分。类别N4名称空间是EDMX所在目录的功能(相对于项目目录)。你可能会想,那又怎样?事实证明,这些命名空间也在App.config文件中引用!具体来说,找一个像这样的部分:

connectionString="metadata=res://*/Database.Master.csdl|...

读取“Database.Master.csdl”的部分是您的CSDL资源的名称。如果这些资源名称不同步,您将收到类似上面的错误,或者可能:

在映射和元数据信息中找不到指定的默认EntityContainer名称“[name]”。

简单的解决方案是更改App.config,为EF映射的每个部分(CSDL,SSDL和MSL)指定正确的资源名称。如果您不确定这些名称是什么,请在ILSpydotPeek中查看已编译程序集的资源。


热门答案

如果将EDMX文件复制到另一个项目,则“构建操作”(在“属性”窗格中)将恢复为目标项目中的默认值“无”,这可能导致“无法找到”EntityContainer名称...“错误,这是因为没有生成资源。 (如果是这种情况,当您在Reflector中打开包含模型的DLL时,将没有资源。)将Build Action设置为“EntityDeploy”并重建解决方案将纠正此问题。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因