2010-06-14 11 views
7

Estoy probando ASP.NET MVC marco 2 con el Entity Framework Microsoft y cuando intento y guardar nuevos registros me sale este error:Mapeo y la información de metadatos no se puede conocer por EntityType Excepción

Mapeo y metadatos la información no se pudo encontrar para EntityType 'WebUI.Controllers.PersonViewModel'

mi Entity Framework almacena los registros de contenedores de tipo persona y mi opinión es fuertemente tipado con la clase PersonViewModel que se deriva de persona. Los registros se guardarían correctamente hasta que trate de usar la clase de modelo de vista derivada. ¿Alguien puede explicar por qué la clase de metadatos no funciona cuando obtengo mi modelo de vista? Quiero poder utilizar un modelo fuertemente tipado y también utilizar anotaciones de datos (metadatos) sin recurrir a mezclar mi lógica de almacenamiento (clases EF) y la lógica de presentación (vistas).

// 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 

actualización: aquí está el seguimiento de la pila:

 
[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 

Respuesta

1

yo sólo he tenido un problema similar (una búsqueda de la excepción me llevan aquí), con MVC3, que para mí resultó ser porque había movido mi archivo edmx y se había confundido sobre a dónde debería apuntar el atributo de espacio de nombres del EdmEntityTypeAttribute.

Creo una estructura similar a la que ha descrito, por la cual tuve una clase de modelo que derivaba de un tipo de entidad y, de nuevo, obtuve el mismo error. Si copio EdmEntityTypeAttribute del tipo de entidad a la clase derivada, el problema desaparece (al menos para escribir, se obtiene un problema diferente al leer). Esto me lleva a pensar que probablemente el marco esté utilizando la reflexión para interrogar a la clase pasada al método add, para determinar qué atributos están presentes, pero solo en el tipo real (se ignora el árbol de herencia).

Pensé en esto y en realidad tiene un poco de sentido si piensas en los datos que fluyen de la base de datos. Si recuperara una lista de objetos 'Persona', la estructura necesitaría decidir a qué clase crear y rellenar de la tabla y no sabe acerca de su clase de Modelo derivada, por lo que necesitará hacer la clase base . En el mejor de los casos, esto significa que está interactuando con el almacenamiento utilizando tipos de entidades sin formato para leer y tipos de modelos para la escritura, lo que parece que podría ser confuso.

El uso de clases parciales en los tipos de entidad generados le permite ampliarlos si lo necesita, o si desea separar explícitamente la entidad y los tipos de modelo, entonces puede ser necesario algún tipo de asignación de objetos.

Por supuesto, todavía estoy conociendo el marco de la entidad, por lo que puede haber otra forma de solucionar el problema. Supongo que en este punto, ya ha encontrado una solución que funciona para usted.

1

Para mí fue un problema simple cuando había llamado mi cuenta de usuario de tabla en mi base de datos por error cuando el valor en el archivo * .edmx era UserAccounts. HTH.

Cuestiones relacionadas