139 votes

Résoudre l'exception InvalidOperationException "L'instance ObjectContext a été éliminée et ne peut plus être utilisée pour des opérations nécessitant une connexion".

J'essaie d'alimenter un GridView en utilisant Entity Frameworkm mais à chaque fois j'obtiens l'erreur suivante :

Property accessor 'LoanProduct' on object 'COSIS_DAL.MemberLoan'". a généré l'exception suivante : L'instance ObjectContext a été été éliminée et ne peut plus être utilisée pour des opérations nécessitant une connexion".

Mon code est :

public List<MemberLoan> GetAllMembersForLoan(string keyword)
{
    using (CosisEntities db = new CosisEntities())
    {
        IQueryable<MemberLoan> query = db.MemberLoans.OrderByDescending(m => m.LoanDate);
        if (!string.IsNullOrEmpty(keyword))
        {
            keyword = keyword.ToLower();
            query = query.Where(m =>
                  m.LoanProviderCode.Contains(keyword)
                  || m.MemNo.Contains(keyword)
                  || (!string.IsNullOrEmpty(m.LoanProduct.LoanProductName) && m.LoanProduct.LoanProductName.ToLower().Contains(keyword))
                  || m.Membership.MemName.Contains(keyword)
                  || m.GeneralMasterInformation.Description.Contains(keyword)

                  );
        }
        return query.ToList();
    }
}

protected void btnSearch_Click(object sender, ImageClickEventArgs e)
{
    string keyword = txtKeyword.Text.ToLower();
    LoanController c = new LoanController();
    List<COSIS_DAL.MemberLoan> list = new List<COSIS_DAL.MemberLoan>();
    list = c.GetAllMembersForLoan(keyword);

    if (list.Count <= 0)
    {
        lblMsg.Text = "No Records Found";
        GridView1.DataSourceID = null;
        GridView1.DataSource = null;
        GridView1.DataBind();
    }
    else
    {
        lblMsg.Text = "";
        GridView1.DataSourceID = null;   
        GridView1.DataSource = list;
        GridView1.DataBind();
    }
}

L'erreur mentionne le LoanProductName de la colonne Gridview . Mentionné : J'utilise C#, ASP.net, SQL-Server 2008 comme base de données dorsale.

Je suis assez novice en matière d'Entity Framework. Je n'arrive pas à comprendre pourquoi j'obtiens cette erreur. Quelqu'un peut-il m'aider ?

1voto

Dans mon cas, j'ai passé tous les modèles 'Users' à la colonne et elle n'a pas été mappée correctement, donc j'ai juste passé 'Users.Name' et ça a marché.

var data = db.ApplicationTranceLogs 
             .Include(q=>q.Users)
             .Include(q => q.LookupItems) 
             .Select(q => new { Id = q.Id, FormatDate = q.Date.ToString("yyyy/MM/dd"), ***Users = q.Users,*** ProcessType = q.ProcessType, CoreProcessId = q.CoreProcessId, Data = q.Data }) 
             .ToList();

var data = db.ApplicationTranceLogs 
             .Include(q=>q.Users).Include(q => q.LookupItems) 
             .Select(q => new { Id = q.Id, FormatDate = q.Date.ToString("yyyy/MM/dd"), ***Users = q.Users.Name***, ProcessType = q.ProcessType, CoreProcessId = q.CoreProcessId, Data = q.Data }) 
             .ToList();

1voto

Zorgarath Points 337

La plupart des autres réponses indiquent un chargement rapide, mais j'ai trouvé une autre solution.

Dans mon cas, j'avais un objet EF InventoryItem avec une collection de InvActivity les objets enfants.

class InventoryItem {
...
   // EF code first declaration of a cross table relationship
   public virtual List<InvActivity> ItemsActivity { get; set; }

   public GetLatestActivity()
   {
       return ItemActivity?.OrderByDescending(x => x.DateEntered).SingleOrDefault();
   }
...
}

Et puisque je tire de la collection d'objets enfant au lieu d'une requête contextuelle (avec IQueryable ), le Include() n'était pas disponible pour mettre en œuvre le chargement rapide. Ma solution a donc consisté à créer un contexte à partir duquel j'ai utilisé la fonction GetLatestActivity() y attach() l'objet retourné :

using (DBContext ctx = new DBContext())
{
    var latestAct = _item.GetLatestActivity();

    // attach the Entity object back to a usable database context
    ctx.InventoryActivity.Attach(latestAct);

    // your code that would make use of the latestAct's lazy loading
    // ie   latestAct.lazyLoadedChild.name = "foo";
}

Ainsi, vous n'êtes pas coincé avec un chargement rapide.

-3voto

Cela pourrait être

 -> context.Configuration.ProxyCreationEnabled = false;

using (var context = new BDPuntoDeVenta())
            {
                context.Configuration.ProxyCreationEnabled = false;
                return context.FacturaDetalle.Where(x => x.ID_Factura == _ID_Factura && x.Devuelto != true).ToList();
            }

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