2010-06-14 8 views
7

gefunden werden konnte ich 2 ASP.NET MVC-Framework Ich versuche aus dem Microsoft Entity Framework und wenn ich versuche, und neue Datensätze speichern ich diesen Fehler:Mapping und Metadaten-Informationen nicht für EntityType Exception

Mapping und Metadaten Informationen könnten nicht für EntityType ‚WebUI.Controllers.PersonViewModel‘ zu finden

Mein Entity Framework Container speichert Daten des Typs Person und meiner Meinung nach ist mit Klasse PersonViewModel stark typisiert, die aus leitet Person. Datensätze würden ordnungsgemäß gespeichert, bis ich versuchte, die abgeleitete Ansichtsmodellklasse zu verwenden. Kann jemand erklären, warum die Metadatenklasse nicht funktioniert, wenn ich mein Ansichtsmodell ableite? Ich möchte in der Lage sein, ein stark typisiertes Modell zu verwenden und auch Datenannotationen (Metadaten) zu verwenden, ohne meine Speicherlogik (EF-Klassen) und Präsentationslogik (Ansichten) zu mischen.

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

aktualisieren: hier ist der Stack-Trace:

 
[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 

Antwort

1

Ich hatte gerade ein ähnliches Problem (eine Suche nach der Ausnahme führt mich hier), mit MVC3, die für mich stellte sich heraus, dass ich meine edmx-Datei verschoben hatte und es war unklar, wo das Namespace-Attribut des EdmEntityTypeAttribute zeigen sollte.

Ich erstelle eine Struktur ähnlich der, die Sie beschrieben haben, wobei ich eine Modellklasse hatte, die von einem Entitätstyp abgeleitet wurde und wieder, ich habe den gleichen Fehler. Wenn ich das EdmEntityTypeAttribute vom Entitätstyp in die abgeleitete Klasse kopiere, verschwindet das Problem (zumindest beim Schreiben, beim Lesen gibt es ein anderes Problem). Das führt mich zu der Annahme, dass das Framework wahrscheinlich eine Reflektion verwendet, um die in die add-Methode übergebene Klasse abzufragen, um zu bestimmen, welche Attribute vorhanden sind, aber nur vom tatsächlichen Typ (der Ererbungsbaum wird ignoriert).

Ich habe darüber nachgedacht und es macht tatsächlich ein bisschen Sinn, wenn Sie an Daten denken, die aus der Datenbank zurückfließen. Wenn Sie eine Liste von "Person" -Objekten abrufen würden, müsste das Framework entscheiden, welche Klasse für die Tabelle erstellt und aus der Tabelle gefüllt werden soll, und es weiß nichts über Ihre abgeleitete Model-Klasse. Daher muss die Basisklasse erstellt werden . Im besten Fall würde dies bedeuten, dass Sie mit dem Speicher interagieren, indem Sie rohe Entitätstypen zum Lesen und Modelltypen zum Schreiben verwenden, was zu Verwirrung führen könnte.

Durch die Verwendung von Teilklassen in den generierten Entitätstypen können Sie diese bei Bedarf erweitern, oder wenn Sie die Entität und die Modelltypen explizit trennen möchten, ist möglicherweise eine Art Objektmapping erforderlich.

Natürlich werde ich immer noch das Entity-Framework kennenlernen, also könnte es auch anders sein. Ich nehme an, zu diesem Zeitpunkt haben Sie bereits eine Lösung gefunden, die für Sie arbeitet.

1

Für mich war es ein einfaches Problem, wo ich versehentlich meine Tabelle UserAccount in meiner Datenbank aufgerufen hatte, als der Wert in der * .edmx-Datei UserAccounts war. HTH.