C# 找不到EntityType异常的映射和元数据信息

C# 找不到EntityType异常的映射和元数据信息,c#,entity-framework,asp.net-mvc-2,metadata,viewmodel,C#,Entity Framework,Asp.net Mvc 2,Metadata,Viewmodel,我正在使用Microsoft Entity Framework试用ASP.NET MVC Framework 2,当我尝试保存新记录时,出现以下错误: 找不到EntityType“WebUI.Controllers.PersonViewModel”的映射和元数据信息 我的实体框架容器存储Person类型的记录,我的视图是强类型的,类PersonViewModel派生自Person。在我尝试使用派生视图模型类之前,记录会正确保存。有人能解释为什么在我派生视图模型时元数据类不起作用吗?我希望能够使用

我正在使用Microsoft Entity Framework试用ASP.NET MVC Framework 2,当我尝试保存新记录时,出现以下错误:

找不到EntityType“WebUI.Controllers.PersonViewModel”的映射和元数据信息

我的实体框架容器存储Person类型的记录,我的视图是强类型的,类PersonViewModel派生自Person。在我尝试使用派生视图模型类之前,记录会正确保存。有人能解释为什么在我派生视图模型时元数据类不起作用吗?我希望能够使用强类型模型并使用数据注释(元数据),而无需混合使用存储逻辑(EF类)和表示逻辑(视图)

//Person类的其余部分由EF自动生成
[元数据类型(typeof(Person.Metadata))]
公共部分阶级人士
{
公共密封类元数据
{
[显示名称(“名字”)]
[必需(ErrorMessage=“字段[名字]是必需的”)]
公共对象名{get;set;}
[显示名称(“中间名称”)]
公共对象名称{get;set;}
[显示名称(“姓氏”)]
[必需(ErrorMessage=“字段[姓氏]是必需的”)]
公共对象LastName{get;set;}
}
}
//从视图(PersonCreate.aspx)
//来自PersonController.cs
公共类PersonViewModel:Person
{
公共列表标题列表{get;set;}
}//结束类PersonViewModel

更新:以下是堆栈跟踪:

[InvalidOperationException: Mapping and metadata information could not be found for EntityType 'WebUI.Controllers.PersonViewModel'.] System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType) +11531168 System.Data.Objects.ObjectContext.VerifyRootForAdd(Boolean doAttach, String entitySetName, IEntityWrapper wrappedEntity, EntityEntry existingEntry, EntitySet& entitySet, Boolean& isNoOperation) +195 System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity) +243 DomainModel.Entities.MyEntities.AddToPeople(Person person) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Entities\MyEntities.Designer.cs:71 DomainModel.Concrete.Repository.SavePerson(Person person) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Concrete\Repository.cs:42 WebUI.Controllers.PersonController.Create(FormCollection form, Int32 hidCancel) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\WebUI\Controllers\PersonController.cs:163 lambda_method(Closure , ControllerBase , Object[] ) +165 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 System.Web.Mvc.c__DisplayClassd.b__a() +125 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709 System.Web.Mvc.Controller.ExecuteCore() +162 System.Web.Mvc.c__DisplayClass8.b__4() +58 System.Web.Mvc.Async.c__DisplayClass1.b__0() +20 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371 [InvalidOperationException:找不到EntityType“WebUI.Controller.PersonViewModel”的映射和元数据信息。] System.Data.Objects.ObjectContext.GetTypeUsage(类型entityCLRType)+11531168 System.Data.Objects.ObjectContext.VerifyRootForAdd(布尔doAttach、字符串entitySetName、EntityWrapper wrappedEntity、EntityEntry existingEntry、EntitySet和EntitySet、Boolean和isNoOperation)+195 System.Data.Objects.ObjectContext.AddObject(字符串entitySetName,对象实体)+243 C:\Users\…\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Entities\MyEntities.AddToPeople(Person-Person)中的DomainModel.Entities.MyEntities.AddToPeople(Person-Person) C:\Users\…\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Concrete\Repository.SavePerson(Person-Person)中的DomainModel.Concrete.Repository.SavePerson(Person-Person)。cs:42 在C:\Users\…\Documents\Visual Studio 2010\Projects\PersonWeb\WebUI\Controllers\PersonController.cs:163中创建(FormCollection表单,Int32 hidCancel) lambda_方法(闭包、控制器基、对象[])+165 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext,IDictionary`2参数)+258 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor ActionDescriptor,IDictionary`2参数)+39 System.Web.Mvc.c__显示类d.b__a()+125 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func`1 continuation)+640 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext、IList1筛选器、ActionDescriptor ActionDescriptor、IDictionary`2参数)+312 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext,String actionName)+709 System.Web.Mvc.Controller.ExecuteCore()+162 System.Web.Mvc.c__显示类8.b__4()+58 System.Web.Mvc.Async.c__显示类1.b__0()+20 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+453 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+371
我刚刚在MVC3上遇到了类似的问题(搜索异常导致我出现在这里),对我来说,这是因为我移动了我的edmx文件,它对EdmEntityTypeAttribute的namespace属性应该指向哪里感到困惑

我创建了一个类似于您所描述的结构,其中我有一个从实体类型派生的模型类,并且再次出现了相同的错误。如果我将EdmEntityTypeAttribute从实体类型复制到派生类,那么问题就消失了(至少对于编写来说,读取时会遇到不同的问题)。这使我相信框架可能正在使用反射来查询传递到add方法中的类,以确定存在哪些属性,但仅限于实际类型(忽略继承树)

我考虑过这一点,如果您考虑从数据库返回的数据,它实际上有点意义。如果要取回“Person”对象的列表,框架需要决定创建什么类并从表中填充,并且它不知道派生模型类,因此需要生成基类。充其量,这意味着您正在和存储交互,使用原始实体类型进行读取,使用模型类型进行写入,这似乎会让人感到困惑

如果需要,在生成的实体类型中使用分部类可以对其进行扩展,或者如果希望显式地分离实体和模型类型,则可能需要某种对象映射


当然,我仍在了解实体框架,因此很可能有另一种解决问题的方法。至此,我假设您已经找到了适合您的解决方案。

对于我来说,这是一个简单的问题,当*.edmx文件中的值为UserAccounts时,我在数据库中错误地调用了我的表UserAccount。嗯

[InvalidOperationException: Mapping and metadata information could not be found for EntityType 'WebUI.Controllers.PersonViewModel'.] System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType) +11531168 System.Data.Objects.ObjectContext.VerifyRootForAdd(Boolean doAttach, String entitySetName, IEntityWrapper wrappedEntity, EntityEntry existingEntry, EntitySet& entitySet, Boolean& isNoOperation) +195 System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity) +243 DomainModel.Entities.MyEntities.AddToPeople(Person person) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Entities\MyEntities.Designer.cs:71 DomainModel.Concrete.Repository.SavePerson(Person person) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Concrete\Repository.cs:42 WebUI.Controllers.PersonController.Create(FormCollection form, Int32 hidCancel) in C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\WebUI\Controllers\PersonController.cs:163 lambda_method(Closure , ControllerBase , Object[] ) +165 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 System.Web.Mvc.c__DisplayClassd.b__a() +125 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709 System.Web.Mvc.Controller.ExecuteCore() +162 System.Web.Mvc.c__DisplayClass8.b__4() +58 System.Web.Mvc.Async.c__DisplayClass1.b__0() +20 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371