web-dev-qa-db-fra.com

La propriété "X" sur "Y" n'a pas pu être définie sur une valeur "null". Vous devez définir cette propriété sur une valeur non nulle de type 'Int32'

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!

24
Mark Saluta
 "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...

24
Bob.

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

21
Yasir Antaal

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.

2
granadaCoder

Pour moi, les étapes suivantes ont corrigé l'erreur:

  1. Supprimer la propriété 'X' de la table 'Y'
  2. Sauvegarder EDMX
  3. construire la base de données à partir du modèle
  4. compiler
  5. Ajoutez à nouveau la propriété 'X' à la table 'Y' (avec non nullable et int16)
  6. Sauvegarder EDMX
  7. construire la base de données à partir du modèle
  8. compiler
1
redM76

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

1
Ali Sadri

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.

0
Martin Staufcik

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.

0
Mark Saluta

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.

0
PeterX

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

0
Izztraab

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

0
Vokail