0

さて、フォームからデータベースの情報を更新しようとしています。しかし、db.SaveShanges()を呼び出すと、KeyNotFoundExceptionが発生します。私はMVC3とEF4.1を使用しています。Controller-> Service->Repository->EFデザインパターンを使用しています。

コールスタック:

   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at System.Data.Objects.EntityEntry.UpdateComplexObjectSnapshot(StateManagerMemberMetadata member, Object userObject, Int32 ordinal, Object currentValue)
   at System.Data.Objects.EntityEntry.DetectChangesInProperties(Boolean detectOnlyComplexProperties)
   at System.Data.Objects.ObjectStateManager.DetectChangesInScalarAndComplexProperties(IList`1 entries)
   at System.Data.Objects.ObjectStateManager.DetectChanges()
   at System.Data.Objects.ObjectContext.DetectChanges()
   at System.Data.Entity.Internal.InternalContext.DetectChanges(Boolean force)
   at System.Data.Entity.Internal.InternalContext.GetStateEntries(Func`2 predicate)
   at System.Data.Entity.Internal.InternalContext.GetStateEntries()
   at System.Data.Entity.Infrastructure.DbChangeTracker.Entries()
   at System.Data.Entity.DbContext.GetValidationErrors()
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()

私のリポジトリdbは、使用しているモデルのDbSetを持つdbContextです。

public bool Save()
{
    try
    {
        db.SaveChanges();
    }
    catch(Exception e)
    {
        return false;
    }
    return true;
}

リポジトリを呼び出すマイサービス

public bool UpdateUserInformationFromSettingsModel(UserSettingsModel model)
{

    int userInfoID = _profile.GetUserInformationID(model.userName);
    UserInformation userInfo = _repository.Get(userInfoID);
    if (userInfo == null)
    {
        return false;
    }
    userInfo.firstName = model.firstName;
    userInfo.lastName = model.lastName;
    userInfo.phone = model.phone;
    userInfo.invoiceReciever = model.invoiceReciever;
    userInfo.invoiceAddress = model.invoiceAddress;
    userInfo.address = model.address;
    userInfo.preferedLanguage = model.preferedLanguage;
    bool saveSuccess = _repository.Save();
    if(!saveSuccess)
    {
        return false;
    }

    return true;
}

私のコントローラー

        [HttpPost]
    public ActionResult Edit(UserSettingsModel model)
    {
        if(ModelState.IsValid)
        {
            if (_userService.UpdateUserInformationFromSettingsModel(model))
            {
                return RedirectToAction("Settings");
            }
            ModelState.AddModelError("", GuiText.editSettingsError);
        }
        return View(model);
    }

UserInformationモデル

public class UserInformation
{
    public int ID { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string phone { get; set; }
    public string invoiceSendOption { get; set; }
    public string invoiceReciever { get; set; }
    public Address invoiceAddress { get; set; }
    public Address address { get; set; }
    public string preferedLanguage { get; set; }
    public string confirmCode { get; set; }
    public UserSiteSettings siteSettings { get; set; }


    public UserInformation()
    {
        firstName = "";
        lastName = "";
        phone = "";
        invoiceSendOption = "";
        invoiceReciever = "";
        invoiceAddress = new Address();
        address = new Address();
        preferedLanguage = "";
        confirmCode = "";
        siteSettings = new UserSiteSettings();
    }

UserSettingsModel

    public class UserSettingsModel
{
    public string userName { get; set; }
    [Display(Name = "name", ResourceType=typeof(GuiText))]
    public string firstName { get; set; }
    public string lastName { get; set; }
    [Display(Name = "phone", ResourceType = typeof(GuiText))]
    public string phone { get; set; }
    [Display(Name = "invoiceInfo", ResourceType = typeof(GuiText))]
    public string invoiceReciever { get; set; }
    public Address invoiceAddress { get; set; }
    [Display(Name = "address", ResourceType = typeof(GuiText))]
    public Address address { get; set; }
    [Display(Name = "prefLang", ResourceType = typeof(GuiText))]
    public string preferedLanguage { get; set; }
    public List<SelectListItem> preferedLanguageList { get; set; }

デバッガーで変数を確認しましたが、すべて問題ないようです。

MySqlコネクタv6.5.4を使用しています。

それで、誰かが問題が何であるかについて何か考えを得ましたか?

4

1 に答える 1

1

数日間の欲求不満と検索の後、私は問題を見つけました。UserInformationクラスとAddressクラスでカスタムメイドのequalsメソッドを使用しました。それが問題を引き起こしました。今、私はそれを削除し、ユニットテストを別の方法で機能するように変更しました。

于 2012-08-29T12:02:09.930 に答える