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

lad*_*dge 23 entity-framework poco efpocoadapter

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

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

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

堆栈跟踪是:

   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
Run Code Online (Sandbox Code Playgroud)

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

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

using (var context = new MyObjectContext())
   foreach (var at in context.AnnouncementTexts)
      Console.WriteLine(at.Title);
Run Code Online (Sandbox Code Playgroud)

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

lad*_*dge 27

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

<Schema Namespace="..." ..
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

connectionString="metadata=res://*/Database.Master.csdl|...
Run Code Online (Sandbox Code Playgroud)

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

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

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