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)指定正确的资源名称.如果您不确定这些名称是什么,请在ILSpy或dotPeek中查看已编译程序集的资源.