Lorsque je lance mon application et que je clique sur un bouton spécifique, le message d'erreur suivant s'affiche:
"The "X" property on "Y" could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'."
Cool donc je vais dans mon projet Entity, vais à la table Y, trouve la colonne X, clique avec le bouton droit de la souris et va aux propriétés de X et trouve que Nullable est défini sur False.
Je vérifie en SQL que dans la table Y, X est configuré pour autoriser les valeurs NULL, et c’est le cas.
Je retourne ensuite à mon projet Entity, définissez Nullable sur True, enregistrez et construisez et je reçois:
Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.
J'ai entendu dire que supprimer la table du fichier .edmx puis de la rajouter était une possibilité, mais je ne l'ai jamais fait et je ne comprends pas suffisamment les implications pour être à l'aise avec cela.
J'ai entendu dire que cela pourrait être dans la vue, dans la procédure stockée ...
J'ai aussi entendu dire qu'il s'agissait d'un bug.
Quelqu'un a-t-il découvert cela et a-t-il trouvé un correctif général ou une sorte de carte routière indiquant où rechercher cette erreur?
Merci!
"The "X" property on "Y" could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'."
Dans votre EDMX, si vous passez sous votre table Y et que vous cliquez sur la colonne X, cliquez avec le bouton droit de la souris sur, choisissez Propriétés, faites défiler jusqu'à Nullable
et passez de False
à True
.
Si vous obtenez une erreur "fragment de mappage", vous devrez supprimer la table de l'EDMX et l'ajouter de nouveau car, dans le Navigateur de modèles, il stocke les propriétés de la table et constitue le seul moyen d'actualiser cette information. consiste à supprimer la table du navigateur de modèle sous <database>.Store
, puis à la récupérer à l'aide de la commande Update Model from Database..
.
Je viens de remplacer le type de données int
par int32?
public Int32 Field{ get; set; }
à
public Int32? Field{ get; set; }
et le problème est résolu
Pour les futurs lecteurs.
J'ai eu cette erreur quand j'avais une procédure stockée à plusieurs résultats.
Comme on le voit ici:
http://msdn.Microsoft.com/en-us/data/jj691402.aspx
Si vous essayez d'accéder à un élément du premier résultat, vous risquez d'obtenir cette erreur après avoir effectué un .NextResult
.
De l'article:
var reader = cmd.ExecuteReader();
// Read Blogs from the first result set
var blogs = ((IObjectContextAdapter)db)
.ObjectContext
.Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly);
foreach (var item in blogs)
{
Console.WriteLine(item.Name);
}
// Move to second result set and read Posts
reader.NextResult();
var posts = ((IObjectContextAdapter)db)
.ObjectContext
.Translate<Post>(reader, "Posts", MergeOption.AppendOnly);
foreach (var item in posts)
{
Console.WriteLine(item.Title);
}
Maintenant, si avant la ligne
foreach (var item in posts)
vous mettez dans ce code
Blog foundBlog = blogs.FirstOrDefault();
Je pense que vous pouvez simuler l'erreur.
Règle de base:
Vous devez toujours traiter cette chose comme une DataReader
(tuyau d'incendie).
Pour mes besoins, je devais convertir en un List<>
.
Alors j'ai changé ça:
foreach (var item in blogs)
{
Console.WriteLine(item.Name);
}
pour ça:
List<Blog> blogsList = blogs.ToList();
foreach (var item in blogsList )
{
Console.WriteLine(item.Name);
}
Et j'ai pu naviguer dans les objets sans avoir l'erreur.
Voici une autre façon je l'ai rencontré.
private void DoSomething(ObjectResult<Blog> blogs, ObjectResult<Post> posts)
{
}
Et puis après ce code (dans l'échantillon d'origine)
foreach (var item in posts)
{
Console.WriteLine(item.Title);
}
mettre dans ce code:
DoSomething(blogs,posts);
Si j’appelais cette routine et commençais à accéder à des éléments/propriétés dans les blogs et les publications, je rencontrerais le problème. Je comprends pourquoi, je devrais l'avoir attrapé la première fois.
Pour moi, les étapes suivantes ont corrigé l'erreur:
Dans mon cas, dans la vue créée dans la colonne de base de données que je sélectionne et qui contient une valeur null, je modifie cette valeur par cette instruction select:
Avant mon changement
select
..., GroupUuId , ..
après mon changement
select
..., ISNULL(GroupUuId, 0), ...
Désolé pour mon mauvais anglais
Cela peut se produire lorsque la table de base de données autorise NULL et que certains enregistrements ont une valeur null et que vous essayez de lire cet enregistrement avec EF et que la classe de mappage n'autorise pas une valeur null.
La solution consiste à modifier la table de base de données afin qu'elle n'autorise pas la valeur null ou à modifier votre classe pour autoriser la valeur null.
J'ai vérifié que l'entité pointait vers la bonne base de données.
J'ai ensuite supprimé la table du fichier .edmx et l'a ajouté à nouveau.
Problème résolu.
Mon problème était que ma base de données Model n'était pas synchronisée avec la base de données réelle (dev). Donc, l’EDMX pensait que c’était smallint
mais la colonne elle-même était int. J'ai mis à jour la base de données de modèle à int
et le EDMX à Int32
et maintenant cela fonctionne.
Vérifiez que votre modèle et votre base de données doivent être définis en conséquence ....
public Int32? X {get; ensemble; } ----> Nullable Par conséquent, dans le DB 'X', Nullable = True
ou
public Int32 X {get; ensemble; } ----> not Nullable Par conséquent, dans le DB 'X', Nullable = false
pour corriger l'erreur
Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.
ouvrez votre fichier EDMX avec et éditeur xml et recherchez-vous dans la table
edmx: StorageModels
trouver la propriété qui donne l'erreur et définir ou ajouter
Nullable = "false" >> à Nullable = "true"
sauvegardez edmx, ouvrez-le dans Visual Studio et construisez-le. problème résolu