2017-03-28 1 views
0

Lorsque je tente de récupérer un objet à partir d'une base de données locale, il génère une exception« séquence ne contient aucun élément » erreur dans Entity Framework

séquence ne contient aucun élément

échantillon Cependant, j'ai ajouté données dans la base de données. Qu'est-ce qui peut causer cette erreur?

private void BindObjectToControls() 
{ 
    Item = new Item(); 

    //set values entered by user into UI to corresponding properties of the object 
    try 
    { 
     Item.Description = cbxType.Text.ToString() + ", " + tbxDesc.Text; 
     Item.Category = (string)cbxCategory.SelectedItem; 
     Item.Brand = (string)cbxBrand.SelectedItem; 
     Item.Price = (int)nudPrice.Value; 
    } 
    catch(NullReferenceException ex) 
    { 
     MessageBox.Show("Error" + ex); 
    } 
} 

private void Save() 
{ 
    BindObjectToControls(); 

    ComputerUZEntities db = new ComputerUZEntities(); 

    if (isNew) 
    { 
     db.Items.Add(Item); 
    } 
    else 
    { 
     Item myItem = (from ctx in db.Items where ctx.ItemID == Item.ItemID select ctx).Single(); 
     //Item is global variable. 
     myItem.Description = Item.Description; 
     myItem.Category = Item.Category; 
     myItem.Brand = Item.Brand; 
     myItem.Price = Item.Price; 
    } 

    db.Items.SqlQuery(sql); 
    db.SaveChanges(); 

    MessageBox.Show("Saved!"); 

    this.Close(); 
} 

P.S J'ai essayé tous les 4 appels Single, SingleOrDefault, First, FirstOrDefault. Aucun d'entre eux n'a travaillé.

+2

Vous dites que l'ID est déjà dans la base de données, je trouve cela très improbable. Placez un point d'arrêt sur votre requête, recherchez l'ID, puis vérifiez manuellement la base de données. En outre, avoir une variable globale qui représente un élément que vous attachez à un contexte EF est une mauvaise idée. – Rob

+0

Désolé la version précédente n'était pas compréhensible, j'ai ajouté plus de lignes de code. So Item est une variable globale et instanciée dans la méthode BindObjectToControls, puis la méthode Save appelle cette méthode –

Répondre

0

Eh bien, le problème n'est pas avec ces 4 appels. Le problème est que vous créez un nouvel objet à chaque fois que la méthode BindObjectToControls() est appelée. Au lieu de créer un new Item() à l'intérieur de BindObjectToControls(), essayez de faire à l'intérieur du constructeur ou ailleurs.