EF Premier Code 4.1 ne prend pas en charge le type de données nvarchar(max) à tous?
J'ai passé la quantité décente de temps sur ce problème et ne peut toujours pas comprendre pourquoi EF équipe rend la vie si difficile en utilisant le Premier Code.
Voici donc quelques exemples:
Ma POCO:
La façon dont je veux que la chose ressemble à:
public class Post
{
public int Id {get; set;}
public string Text {get; set;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(p => p.Text)
.HasColumnType("nvarchar(max)");
}
La seule chose qui fonctionne:
public class Post
{
public int Id {get; set;}
[StringLength(4000)]
public string Text {get; set;}
}
Le problème est que lorsque dans le premier cas, j'essaie d'insérer tout ce qu'il me donne: Validation failed for one or more entities
et le deuxième cas ne correspondent pas à mon modèle d'affaires.
Suis-je le seul avec ce problème? Comment puis-je faire face à cette chose?
Vous devez vous connecter pour publier un commentaire.
À l'aide de
Int32.MaxValue
peut conduire à certains problèmes lorsqu'il est connecté à une base de données SQL Server. À l'aide deInt32.MaxValue
en soit l'attribut ou de l'api renvoie une exception indiquant "colonne de Chaîne avec MaxLength de plus de 4000 n'est pas pris en charge". Mais, en utilisant l'une des méthodes suivantes fonctionne très bien pour moi en EF 4.1:Vous pouvez utiliser le
MaxLengthArritbute
, par exempleOu de l'API fluent, comme
D'imposer l'utilisation de
ntext
utiliser l'une des opérations suivantes:Ou de l'API fluent, comme
Vous ne pouvez pas besoin de l'
MaxLength
attribut dans ce cas.Mise à JOUR (2017-Sep-6):
Comme Sebazzz l'a souligné dans son commentaire
ntext
(ettext
) a été désapprouvée dans SQL Server 2016. Voici un lien pour plus d'informations:https://docs.microsoft.com/en-us/sql/database-engine/deprecated-database-engine-features-in-sql-server-2016
ntext
est obsolète. Il n'est pas conseillé de l'utiliser pour les nouveaux développements.Utiliser ceci:
Ou ceci:
À l'aide de la [MaxLength] attribut sans aucune valeur, comme le décrit André Artus post, fonctionne parfaitement. Sous SQL CE qu'il utilise correctement "ntext", tandis que sous SQL Serveur, il utilise des "nvarchar(max)". Cela est hautement souhaitée, mais devrait être précisé dans la documentation.
ntext
ensuite, il est facile à appliquer[Column(TypeName = "ntext")]
ou.HasColumnType("ntext")
comme je l'ai fait dans mon post initial.J'ai utilisé le code ci-dessous pour obtenir de type nvarchar(max) pour un champ dans la base de données. Je suis à l'aide de EF5.
J'ai résolu mon problème avec quelque chose comme ceci: