Не удалось найти информацию о сопоставлении и метаданных для исключения EntityType

Я пробую ASP.NET MVC Framework 2 с Microsoft Entity Framework, и когда я пытаюсь сохранить новые записи, я получаю эту ошибку:

Не удалось найти информацию о сопоставлении и метаданных для EntityType 'WebUI.Controllers.PersonViewModel'

Контейнер My Entity Framework хранит записи типа Person, а мое представление строго типизировано с помощью класса PersonViewModel, который является производным от Person. Записи будут сохраняться должным образом, пока я не попытаюсь использовать производный класс модели представления. Может ли кто-нибудь объяснить, почему класс метаданных не работает, когда я получаю свою модель представления? Я хочу иметь возможность использовать строго типизированную модель, а также использовать аннотации данных (метаданные), не прибегая к смешиванию моей логики хранения (классы 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: 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  


person dcompiled    schedule 14.06.2010    source источник


Ответы (2)


У меня только что была аналогичная проблема (поиск исключения привел меня сюда) с MVC3, которая для меня оказалась из-за того, что я переместил свой файл edmx, и он запутался в том, где должен быть атрибут пространства имен EdmEntityTypeAttribute. указывать.

Я создаю структуру, аналогичную той, которую вы описали, в результате чего у меня был класс модели, производный от типа сущности, и я снова получил ту же ошибку. Если я скопирую EdmEntityTypeAttribute из типа сущности в производный класс, проблема исчезнет (по крайней мере, для записи вы получите другую проблему при чтении). Это наводит меня на мысль, что фреймворк, вероятно, использует отражение для опроса класса, переданного в метод добавления, чтобы определить, какие атрибуты присутствуют, но только для фактического типа (дерево наследования игнорируется).

Я думал об этом, и это действительно имеет некоторый смысл, если вы думаете о данных, возвращаемых из базы данных. Если вы должны получить список объектов 'Person', фреймворку нужно будет решить, какой класс создать и заполнить из таблицы, и он не знает о вашем производном классе модели, поэтому ему нужно будет сделать базовый класс . В лучшем случае это будет означать, что вы взаимодействуете с хранилищем, используя необработанные типы сущностей для чтения и типы моделей для записи, что, похоже, сбивает с толку.

Использование частичных классов в сгенерированных типах сущностей позволяет вам расширять их, если вам нужно, или если вы хотите явно разделить типы сущности и модели, тогда может потребоваться какое-то сопоставление объектов.

Конечно, я все еще знакомлюсь с фреймворком сущностей, так что вполне может быть другой способ решения проблемы. Я предполагаю, что к этому моменту вы уже нашли решение, которое вам подходит.

person forsvarir    schedule 01.04.2011

Для меня это была простая проблема, когда я по ошибке назвал свою таблицу UserAccount в своей базе данных, когда значение в файле * .edmx было UserAccounts. HTH.

person user8128167    schedule 07.11.2013