«Ссылка на объект» не задана при сохранении изменений в контейнере сущностей - PullRequest
3 голосов
/ 24 февраля 2011

Я продолжаю сталкиваться с ошибкой, когда сохраняю изменения, внесенные в объект сущности.Вот код, который дает сбой.

public override bool ChangePassword(string username, string oldPassword, string newPassword)
{
    //We dont wont to do anything if there is no username supplied
    if (!string.IsNullOrEmpty(username))
    {
        User user = null;
        using (UserContainer userContainer = new UserContainer())
        {
            //Gets the user from Enity Stored Procedure
            List<User> results = userContainer.usp_MVC_Users_getbyemailaddress(username).ToList();

            //To prevent an exeption we test how many records are returned, then assign it
            if (results.Count() > 0)
                user = results.First();

            if (user != null)
            {
                string encryptedOldPassword = encrypt(oldPassword);

                //does the supplied password match the old password?
                if (user.Password == encryptedOldPassword)
                {
                    //Set new password
                    user.Password = encrypt(newPassword);

                    //Save the info
                    // userContainer.Refresh(System.Data.Objects.RefreshMode.ClientWins, user);
                    userContainer.SaveChanges();

                    return true;
                }
            }
        }
    }
}

трассировка стека:

   at System.Data.Mapping.ViewGeneration.ViewgenGatekeeper.EnsureAllCSpaceContainerSetsAreMapped(IEnumerable`1 cells, ConfigViewGenerator config, StorageEntityContainerMapping containerMapping)
   at System.Data.Mapping.ViewGeneration.ViewgenGatekeeper.GenerateViewsFromCells(List`1 cells, ConfigViewGenerator config, CqlIdentifiers identifiers, StorageEntityContainerMapping containerMapping)
   at System.Data.Mapping.ViewGeneration.ViewgenGatekeeper.GenerateViewsFromMapping(StorageEntityContainerMapping containerMapping, ConfigViewGenerator config)
   at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGenerateViews(EntityContainer container, Dictionary`2 resultDictionary)
   at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGetGeneratedViews(EntityContainer container)
   at System.Data.Common.Utils.Memoizer`2.c__DisplayClass2.b__0()
   at System.Data.Common.Utils.Memoizer`2.Result.GetValue()
   at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg)
   at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.GetGeneratedView(EntitySetBase extent, MetadataWorkspace workspace, StorageMappingItemCollection storageMappingItemCollection)
   at System.Data.Mapping.StorageMappingItemCollection.GetGeneratedView(EntitySetBase extent, MetadataWorkspace workspace)
   at System.Data.Mapping.Update.Internal.ViewLoader.InitializeEntitySet(EntitySetBase entitySetBase, MetadataWorkspace workspace)
   at System.Data.Mapping.Update.Internal.ViewLoader.SyncInitializeEntitySet[TArg,TResult](EntitySetBase entitySetBase, MetadataWorkspace workspace, Func`2 evaluate, TArg arg)
   at System.Data.Mapping.Update.Internal.ViewLoader.SyncContains[T_Element](EntitySetBase entitySetBase, MetadataWorkspace workspace, Set`1 set, T_Element element)
   at System.Data.Mapping.Update.Internal.ViewLoader.IsServerGen(EntitySetBase entitySetBase, MetadataWorkspace workspace, EdmMember member)
   at System.Data.Mapping.Update.Internal.ExtractorMetadata..ctor(EntitySetBase entitySetBase, StructuralType type, UpdateTranslator translator)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.GetExtractorMetadata(EntitySetBase entitySetBase, StructuralType type)
   at System.Data.Mapping.Update.Internal.ExtractorMetadata.ExtractResultFromRecord(IEntityStateEntry stateEntry, Boolean isModified, IExtendedDataRecord record, Boolean useCurrentValues, UpdateTranslator translator, ModifiedPropertiesBehavior modifiedPropertiesBehavior)
   at System.Data.Mapping.Update.Internal.RecordConverter.ConvertStateEntryToPropagatorResult(IEntityStateEntry stateEntry, Boolean useCurrentValues, ModifiedPropertiesBehavior modifiedPropertiesBehavior)
   at System.Data.Mapping.Update.Internal.RecordConverter.ConvertOriginalValuesToPropagatorResult(IEntityStateEntry stateEntry, ModifiedPropertiesBehavior modifiedPropertiesBehavior)
   at System.Data.Mapping.Update.Internal.ExtractedStateEntry..ctor(UpdateTranslator translator, IEntityStateEntry stateEntry)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.LoadStateEntry(IEntityStateEntry stateEntry)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.PullModifiedEntriesFromStateManager()
   at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()
   at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
   at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Objects.ObjectContext.SaveChanges()
   at CMSMVC.Models.Providers.CmsMembershipProvider.ChangePassword(String username, String oldPassword, String newPassword) in C:\Projects\CMSMVC\CMSMVC\Models\Providers\CmsMembershipProvider.cs:line 129
   at CMSMVC.Tests.CmsMembershipProviderTest.ChangePasswordTest() in C:\Projects\CMSMVC\CMSMVC.Tests\CmsMembershipProviderTest.cs:line 105

Я проверил все, и я довольно озадачен этим.Он зарегистрирован в контейнере объекта.Обновление сопоставлено с хранимой процедурой, это проблема сопоставления?

1 Ответ

2 голосов
/ 24 февраля 2011

Похоже, вы читаете свой объект из хранимой процедуры, обновляете его, а затем фиксируете с помощью ObjectContext.SaveChanges.Единственный способ увидеть этот сбой - если каким-то образом SP возвращает вам искаженный объект, который нарушает EF.

Я бы рекомендовал закомментировать ваш вызов SP и добавить что-то вроде

User U = userContainer.Users.FirstOrDefault(u => u.UserName == username);

и посмотрим, исправит ли это что-то.Если это так, вы будете знать, что проблема заключается в вашем SP.

Кроме того, ваш SP называется usp_MVC_Users_getbyemailaddress, но вы передаете ему имя пользователя - это правильно, или вы, возможно, вызываете неправильный sproc (или, возможно, передаете неправильный параметр).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...