ObjectStateManager не содержит ObjectStateEntry со ссылкой на объект типа - PullRequest
3 голосов
/ 21 июня 2011

Я использую EISK (Employee Info Starter Kit) для разработки приложения. Моя диаграмма сущностей выглядит следующим образом Entity Diagram Я пытаюсь обновить таблицу приложения с помощью этого кода.

           int apId = Convert.ToInt32(Request.QueryString["ApplicationID"]);

            ApplicationBLL objGetApplication = new ApplicationBLL();

            Appdec.YEP.BusinessEntities.Application objApplication =
            objGetApplication.GetApplicationByApplicationID(apId);



            objApplication.Status = (ddlStatus.SelectedValue == "0" ? false : true);



            new ApplicationBLL(new Appdec.YEP.DataAccessLayer.DatabaseContext()).UpdateApplication(objApplication);

теперь метод обновления в бизнес-логике

 [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)]
    public void UpdateApplication(Application updatedApplication)
    {
        // Validate Parameters
        if (updatedApplication == null)
            throw (new ArgumentNullException("updatedApplication"));

        // Validate Primary key value
        if (updatedApplication.ApplicationID.IsInvalidKey())
            BusinessLayerHelper.ThrowErrorForInvalidDataKey("ApplicationID");

        // Apply business rules
        OnApplicationSaving(updatedApplication);
        OnApplicationUpdating(updatedApplication);

        //attaching and making ready for parsistance
        if (updatedApplication.EntityState == EntityState.Detached)
            _DatabaseContext.Applications.Attach(updatedApplication);



_DatabaseContext.ObjectStateManager.ChangeObjectState(updatedApplication, System.Data.EntityState.Modified);//this line throws the error 
//ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type
        int numberOfAffectedRows = _DatabaseContext.SaveChanges();
        if (numberOfAffectedRows == 0) 
            throw new DataNotUpdatedException("No application updated!");

        //Apply business workflow
        OnApplicationUpdated(updatedApplication);
        OnApplicationSaved(updatedApplication);

    }

Может кто-нибудь сказать мне, как исправить эту ошибку и обновить таблицы. та же ошибка возникает, когда я пытаюсь обновить другие таблицы. Вставка работает отлично. Надеюсь не беспокоить вас. С наилучшими пожеланиями.

1 Ответ

7 голосов
/ 21 июня 2011

Так что он уже принадлежит контексту, и вы должны обновить этот контекст. Это не может быть присоединено к новому контексту, Вы можете создать новый экземпляр updatedApplication и скопировать все свойства updatedApplication в этот новый и присоединить новый объект к приложению.

Также изменить

  if (newApp .EntityState == EntityState.Detached)
            _DatabaseContext.Applications.Attach(newApp );

до

var newApp = Application ();
 //Copy all propery of updatedApplication to  newApp here 

            if (newApp .EntityKey == null || newApp .EntityKey.IsTemporary)
            {
                _DatabaseContext.Applications.AddObject(newApp );
            }
            else
            {
                _DatabaseContext.Applications.Attach(newApp );
            }
_DatabaseContext.ObjectStateManager.ChangeObjectState(newApp , System.Data.EntityState.Modified);
...