2012-08-23 42 views
0

Okey,所以我試圖從窗體更新我的數據庫中的信息。 但是當我調用db.SaveShanges()我得到KeyNotFoundException。 我正在使用MVC3和EF 4.1。 我使用Controller-> Service-> Repositry-> EF設計模式。SaveChanges()上的KeyNotFoundException()

調用堆棧:

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() 

我repositrory 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。

所以,任何人有什麼想法可能是什麼問題?

+0

你的Get方法是在userinfo上設置ID嗎? – podiluska

+0

是的userInfo我有一個ID集。 – TobiasW

+0

有沒有機會看到模型和任何特殊映射? – JTMon

回答

1

經過一段日子的挫折和搜索,我發現了問題。 我在UserInformation和Address類中使用了一個自定義的equals方法。這導致了問題。現在我已經移除它並更改我的單元測試以另一種方式工作。