2011-02-24 7 views
3

エンティティオブジェクトに対して行った変更を保存するとエラーが発生します。ここで失敗するコードがあります。エンティティコンテナの「オブジェクト参照」が設定変更されていません

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に困惑しています。エンティティのコンテナに登録されます。更新はストアドプロシージャにマッピングされますが、マッピングの問題ですか?

+0

CmsMembershipProviderで129行目はどれですか? – Nick

+0

"userContainer.SaveChanges();" – BenE

+2

あなたの 'if(results.Count()> 0)user = results.First();'は 'user = results.FirstOrDefault();'としてよりきれいに記述することができます。 –

答えて

2

オブジェクトをストアドプロシージャから読み込み、更新してからObjectContext.SaveChangesを呼び出しているようです。私がこのクラッシュを見ることができる唯一の方法は、どういうわけか、SPがあなたにEFを壊している不正なオブジェクトを返すことです。

私はあなたのSPの呼び出しをコメントアウトし、

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

のようなものに入れてお勧めしますし、それは物事を修正するかどうかを確認します。もしそうなら、その問題があなたのSPであることを知るでしょう。

また、あなたのSPがusp_MVC_Users_getbyemailaddressと呼ばれていますが、それにユーザ名を渡している - これは正しいですか、あなたは多分間違ったSPROCを呼び出す(または多分間違ったパラメータを渡して)されています。

関連する問題