【问题标题】:Mapping and metadata information could not be found for EntityType Exception找不到 EntityType 异常的映射和元数​​据信息
【发布时间】:2010-06-14 01:14:55
【问题描述】:

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

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

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

// Rest of the Person class is autogenerated by the EF
[MetadataType(typeof(Person.Metadata))]
public partial class Person
{
  public sealed class Metadata
  {
    [DisplayName("First Name")]
    [Required(ErrorMessage = "Field [First Name] is required")]
    public object FirstName { get; set; }

    [DisplayName("Middle Name")]            
    public object MiddleName { get; set; }

    [DisplayName("Last Name")]
    [Required(ErrorMessage = "Field [Last Name] is required")]
    public object LastName { get; set; }
  }
}

// From the View (PersonCreate.aspx)
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
         Inherits="System.Web.Mvc.ViewPage<WebUI.Controllers.PersonViewModel>" %>

// From PersonController.cs
public class PersonViewModel : Person
{
   public List<SelectListItem> TitleList { get; set; }
} // end class PersonViewModel

更新:这是堆栈跟踪:

[InvalidOperationException:找不到 EntityType 'WebUI.Controllers.PersonViewModel' 的映射和元数​​据信息。] System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType) +11531168 System.Data.Objects.ObjectContext.VerifyRootForAdd(Boolean doAttach, String entitySetName, IEntityWrapper WrapperEntity, EntityEntry existingEntry, EntitySet& entitySet, Boolean& isNoOperation) +195 System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity) +243 C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Entities\MyEntities.Designer.cs:71 中的 DomainModel.Entities.MyEntities.AddToPeople(Person person) C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\DomainModel\Concrete\Repository.cs:42 中的 DomainModel.Concrete.Repository.SavePerson(Person person) WebUI.Controllers.PersonController.Create(FormCollection form, Int32 hidCancel) 在 C:\Users\...\Documents\Visual Studio 2010\Projects\PersonWeb\WebUI\Controllers\PersonController.cs:163 lambda_method(闭包,ControllerBase,对象[])+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__DisplayClassd.b__a() +125 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func`1 延续)+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__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

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-2 metadata viewmodel


    【解决方案1】:

    我刚刚遇到了类似的问题(搜索异常导致我在这里),使用 MVC3,这对我来说是因为我移动了我的 edmx 文件并且它对命名空间属性的位置感到困惑EdmEntityTypeAttribute 应该指向。

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

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

    在生成的实体类型中使用部分类允许您在需要时扩展它们,或者如果您想显式分离实体和模型类型,则可能需要某种对象映射。

    当然,我还在了解实体框架,所以很可能有另一种方法可以解决这个问题。我假设到此为止,您已经找到了适合您的解决方案。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-01-21
        • 1970-01-01
        • 2023-03-29
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 2020-02-21
        • 2012-05-01
        相关资源
        最近更新 更多