51 votes

Code EF en premier: Comment spécifier qu'une propriété doit générer une colonne TEXT plutôt qu'un nvarchar (4000)

Je suis en train de travailler avec le Premier Code de la fonctionnalité de l'Entity Framework et j'essaie de comprendre comment je peux spécifier les types de données des colonnes qui doivent être créés lorsque la base de données est généré automatiquement.

J'ai un modèle simple:

public class Article
{
    public int ArticleID { get; set; }

    public string Title { get; set; }
    public string Author { get; set; }
    public string Summary { get; set; }
    public string SummaryHtml { get; set; }
    public string Body { get; set; }
    public string BodyHtml { get; set; }
    public string Slug { get; set; }

    public DateTime Published { get; set; }
    public DateTime Updated { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
}

Quand je lance mon application, SQL CE 4.0 base de données est automatiquement créé avec le schéma suivant:

DB Schema

Jusqu'à présent, tellement bon! Toutefois, les données, je vais être de l'insertion dans l' Body et BodyHtml propriétés est systématiquement supérieure à la longueur maximale autorisée pour l' NVarChar type de colonne, donc je veux EF pour générer Text colonnes pour ces propriétés.

Cependant, je n'arrive pas à trouver un moyen de le faire! Après un peu de recherche sur Google et de la lecture, j'ai essayé de spécifier le type de colonne à l'aide de DataAnnotations, à partir d'informations trouvées dans cette réponse:

using System.ComponentModel.DataAnnotations;

...

[Column(TypeName = "Text")]
public string Body { get; set; }

Cela lève l'exception suivante (lorsque la base de données est supprimée, et l'application est re-run):

Schema specified is not valid. Errors: (12,6) : error 0040: The Type text is not qualified with a namespace or alias. Only PrimitiveTypes can be used without qualification.

Mais je n'ai aucune idée de ce que l'espace de noms ou alias je dois spécifier, et je ne pouvais pas trouver quelque chose qui me le dire.

J'ai aussi essayé de changer l'annotation que par cette référence:

using System.Data.Linq.Mapping;

...

[Column(DbType = "Text")]
public string Body { get; set; }

Dans ce cas, une base de données est créée, mais l' Body colonne est toujours un NVarChar(4000), il semble donc que l'annotation est ignoré.

Quelqu'un peut-il aider? Cela semble comme il devrait être assez exigence commune, et pourtant ma recherche a été vaine!

77voto

Marcel Popescu Points 1174

J'apprécie l'effort consenti pour la réponse existante, mais je ne l'ai pas trouvée répondre à la question ... donc j'ai testé cela et découvert que

 [Column(TypeName = "ntext")]
public string Body { get; set; }
 

(celui de System.ComponentModel.DataAnnotations ) travaillera pour créer une colonne de type ntext.

(Mon problème avec la réponse acceptée est qu'il semble indiquer que vous devez changer le type de colonne dans l'interface, mais la question est de savoir comment procéder par programme.)

32voto

Michael Points 363

Vous pouvez utiliser le DataAnnotation suivant et Code-First générera le type de données de taille maximale autorisée par la base de données. Dans le cas de Sql CE, il en résulte une colonne ntext sous-jacente.

 [MaxLength]
 

ou en utilisant l'API EF 4.1 RC fluent ...

 protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Article>()
        .Property(p => p.Body)
        .IsMaxLength();
}
 

9voto

Kristof Claes Points 5867

Avez-vous essayé d' ntext? Je viens de créer un SQL CE 4.0 base de données, et quand j'ai manuellement ajouter une colonne à une table, je remarque qu' text n'est pas disponible dans la liste de types de données tout en ntext est. Comme vous pouvez vous procurer nvarchar mais n' varchar.

Malheureusement, le plus gros nvarchar taille, vous pouvez choisir est de 4000. Donc, nvarchar(max) est pas non plus une option.

There is ntext but no text

6voto

nakchak Points 348

Le problème avec l'aide de la longueur de la chaîne d'attribut par exemple

[StringLength(4010)]

C'est que toute chaîne de caractères > le nombre de caractères défini dans l'attribut va déclencher une exception de validation, qui va à l'encontre de toute raison pourquoi vous devez utiliser un non défini la taille du champ sur une colonne, ou vous utilisez un grand nombre dans l'attribut et de perdre toute validation offerts par l'attribut. En fin de compte vous êtes à l'aide d'un mécanisme de validation de résoudre un mappage de problème si vous utilisez la StringLength attribut, où Marcel Popescu la réponse à l'aide de l'attribut de la Colonne est une bien meilleure solution est d'utiliser le mappage des attributs pour définir le type, et permet toujours d'utiliser les StringLength attribut pour la validation.

Une autre option est d'utiliser le EF4 CTP5 API fluent et de définir le mappage de colonne dans la OnModelCreating événement dans le DbContext par exemple

protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Article>()
    .Property(p => p.Body)
    .HasColumnType("nvarchar(max)");
}

Il convient également de noter que NText est déconseillé de type de donnéesntext, du texte et de l'image (Transact-SQL) MME Livres en Ligne) et de la recommandation est d'utiliser le type de données NVarChar(MAX) à sa place

5voto

Johan Plogfeldt Points 31

Je sais, c'est probablement un an trop tard, mais:

Utilisation:

 [StringLength(-1)] 
 

Cela créera un champ nText. J'ai réussi à stocker au moins 25 Ko dans ce domaine à l'aide de la base de données Compact Edition 4.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X