2010-11-22 14 views
0

J'essaie d'utiliser des annotations de données pour valider mes modèles Entity Framework à l'aide de classes partielles.J'ai des problèmes avec MetadataType, Annotations et EF

On m'a dit dans ce article (MSDN), que la classe partielle devrait être dans le même espace de noms que le modèle de données. Mon modèle de données est situé dans EntityFrameworkDataProvider, donc ma classe partielle qui est situé à MyApp.Backend.Models ressemble à ceci:

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; } 
    } 
} 

Je valider le modèle dans ma classe de contrôleur comme ceci:

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

    return View("Details", item); 
} 

Il compile sans erreurs. Cependant, en essayant de modifier un élément, cette erreur est ce que je reçois:

Message d'erreur du compilateur: CS0433: Le type 'EntityFrameworkDataProvider.Item' existe à la fois dans 'long-path.DLL' et dans 'long-path.DLL '

Je suppose que la classe Item est en cours de compilation deux fois ou quelque chose. Comment cette erreur devrait-elle être évitée?

Répondre

2

L'action de votre contrôleur est incorrecte. Vous ne devez jamais utiliser les paramètres d'action et TryUpdateModel sur le même type, car les messages d'erreur seront insérés deux fois dans l'état du modèle. Votre action devrait ressembler à ceci:

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

En ce qui concerne le message d'erreur du compilateur que vous obtenez vous n'avez pas fourni suffisamment d'informations pour que je puisse vous aider. Assurez-vous que cette classe d'élément n'est pas définie dans des emplacements différents et que c'est bien partial dans chaque fichier .cs que vous le rencontrez. Je soupçonne que quelque part vous avez défini une classe Item qui n'est pas partielle. Ce que vous devez également savoir, c'est que si cette classe Item est définie dans un assembly séparé, même si elle est marquée avec partial, une fois compilée, la notion de partial n'existe plus. Les classes partielles ne fonctionnent que dans le même assemblage.

+0

Bien sûr, cela pourrait être correct mais cela ne change rien au fait que les deux assemblages "entrent en collision". +1 pour le pourboire, cependant. – Mickel

+0

Est-ce que par hasard cette classe 'Item' définie dans un assembly séparé et distinct signifie que je veux dire différent de l'assembly qui contient le code que vous avez posté? –

+0

Il s'agit de 2 projets ... EntityFrameworkDataProvider.Item et MyApp.Backend.Models (asp.net mvc app). Vous ne savez pas si le projet séparé == assemblage séparé? – Mickel