2010-11-22 9 views
0

Ich versuche, Datenanmerkungen zu verwenden, um meine Entity Framework-Modelle mit partiellen Klassen zu validieren.Ich habe Probleme mit MetadataType, Annotationen und EF

Ich wurde in diesem article (MSDN) gesagt, dass die partielle Klasse im selben Namespace wie das Datenmodell sein sollte. Meine Datenmodell ist in EntityFrameworkDataProvider befindet, so dass meine Teilklasse, die in MyApp.Backend.Models befindet sich wie folgt aussieht:

using System.ComponentModel.DataAnnotations; 

namespace EntityFrameworkDataProvider 
{ 
    [MetadataType(typeof(ItemMetaData))] 
    public partial class Item { } 

    public class ItemMetaData 
    { 
     [ScaffoldColumn(false)] 
     public object CreateDate { get; set; } 

     [Required] 
     public string DisplayName { get; set; } 

     [Required] 
     public string Description { get; set; } 
    } 
} 

ich bestätigen das Modell in meinem Controller-Klasse wie folgt aus:

[HttpPost] 
public ViewResult Edit(Item item) 
{ 
    if (!TryUpdateModel(item)) 
    { 
     return View(item); 
    } 

    return View("Details", item); 
} 

Es kompiliert ohne Fehler. Wenn ich jedoch versuche, ein Element zu bearbeiten, ist dieser Fehler, was ich bekomme:

Compiler Fehlermeldung: CS0433: Der Typ 'EntityFrameworkDataProvider.Item' existiert sowohl in 'long-path.DLL' und 'long-path.DLL '

Ich denke, die Item-Klasse wird zweimal oder etwas kompiliert. Wie soll dieser Fehler verhindert werden?

Antwort

2

Ihre Controller-Aktion ist falsch. Sie sollten niemals Aktionsparameter und TryUpdateModel für denselben Typ verwenden, da die Fehlernachrichten im Modellstatus zweimal eingefügt werden. Ihre Aktion sollte wie folgt statt aussehen:

[HttpPost] 
public ViewResult Edit(Item item) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(item); 
    } 
    return View("Details", item); 
} 

Was die Compiler-Fehlermeldung Sie bekommen Sie haben nicht genug Informationen zur Verfügung gestellt, so dass ich Ihnen helfen kann. Stellen Sie sicher, dass diese Item-Klasse nicht an verschiedenen Orten definiert ist und dass es tatsächlich partial in jeder einzelnen .cs Datei ist, in der Sie darauf stoßen. Ich vermute, dass irgendwo eine Item Klasse definiert ist, die nicht partiell ist. Was Sie ebenfalls beachten sollten, ist, dass, wenn diese Klasse Item in einer separaten Assembly definiert ist, auch wenn sie mit partiell markiert ist, der Begriff partiell nicht mehr existiert. Teilklassen funktionieren nur innerhalb derselben Baugruppe.

+0

sicher, das könnte richtig sein, aber es ändert nichts daran, dass die beiden Baugruppen "kollidieren". +1 für den Tipp. – Mickel

+0

Ist diese "Item" -Klasse zufällig in einer separaten Assembly definiert und durch separate ich meine anders als die Assembly, die den Code enthält, den Sie gebucht haben? –

+0

Es ist 2 Projekte ... EntityFrameworkDataProvider.Item und MyApp.Backend.Models (asp.net mvc app). Nicht sicher, ob separates Projekt == separate Montage? – Mickel

Verwandte Themen