2011-07-08 1 views
2

J'utilise d'abord EF 4.1 avec base de données.Pourquoi le framework d'entité n'annote-t-il pas certaines colonnes non nullables comme requis?

table Exemple:

CREATE TABLE dbo.Foo(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    Created datetime not null default(getdate()), 
    Title varchar(80) not null 

PRIMARY KEY CLUSTERED ([ID] ASC) 
) 

EF charge correctement le modèle avec les 3 colonnes comme annulable = false.

sortie du poste de génération de code "ADO.NET DbContext générateur":

public partial class Foo 
{ 
    public int ID { get; set; } 
    public System.DateTime Created { get; set; } 
    public string Title { get; set; } 
} 

Dans MVC3 je générer le FooController via le contexte db et le modèle foo. Quand j'appelle/Foo/Create et que je clique sur "Créer" sur le formulaire vierge, une erreur de validation apparaît dans le champ "Créé" mais pas dans "Titre".

Si j'entre seulement « créé » ce jour, je reçois une exception:

validation a échoué pour une ou plusieurs entités. Pour plus de détails, voir la propriété 'EntityValidationErrors'

L'exception est "Le champ Titre est obligatoire".

Je ne sais pas pourquoi cela fonctionne bien pour une colonne mais pas pour l'autre. Mon premier correctif consistait simplement à ajouter l'annotation, mais le code de la classe est généré automatiquement par EF.

La seule solution qui semble fonctionner est d'utiliser une classe de métadonnées partielle: ASP.NET MVC3 - Data Annotations with EF Database First (ObjectConext, DbContext)

Je peux ajouter la balise [Obligatoire] comme vous le souhaitez mais cela ne devrait pas être nécessaire. Est-ce un bug dans EF ou est-ce que je manque quelque chose?

Répondre

1

Ce n'est pas un bogue, EF n'ajoute simplement pas ces attributs. Pour autant que je sache, l'approche database-first (classes d'entités générées par le concepteur) n'effectue même pas la validation. Le lien auquel vous faites référence est une solution valable pour votre problème. Le principe des classes buddy qui contiennent les métadonnées réelles a été introduit en raison du fait que vous ne pouvez pas ajouter d'attributs aux propriétés existantes dans une classe partielle.

L'approche code-first a une fonctionnalité intégrée pour valider vos annotations, voir: Entity Framework 4.1 Validation. Une autre solution lors de l'utilisation de la base de données en premier serait de créer un générateur de code personnalisé qui applique ces attributs T4 Templates and the Entity Framework.

+0

L'approche des métadonnées semble être un travail supplémentaire, mais elle résout le problème. J'ai considéré le code d'abord, mais je pense que les révisions seraient difficiles sans un produit comme SQL Compare + sauvegarde de schéma préalable. – wtjones

Questions connexes