2012-05-22 45 views
1

我有一個複雜的對象引用了其他對象,我試圖從我的web應用程序保存它。unitofwork和repositorypattern一個實體對象不能被IEntityChangeTracker的多個實例引用

因此,在我的web應用程序中,我稱之爲業務邏輯,並從bl中調用DAL Facade,然後調用DAL。

當我執行Insert方法時,我遇到了異常。

DAL層的代碼,這是引發異常的地方。

public void InsertEcoBonusRequest(EcoBonusRequest ecoBonusRequest) 
     { 
      _context.EcoBonusRequests.Add(ecoBonusRequest); 
     } 

代碼在Unitofwork.cs

public void Save() 
     { 
      _context.SaveChanges(); 
     } 

private RequestBaseRepository _requestBaseRepository; 

public EcoBonusRequestRepository EcoBonusRequestRepository 
      { 
       get 
       { 
        return _ecobonusworkflowRepository ?? 
          (_ecobonusworkflowRepository = new EcoBonusRequestRepository(_context)); 
       } 
      } 

代碼中的dal門面:

private static readonly UnitOfWork UnitOfWork = new UnitOfWork(); 

     public void Save(EcoBonusRequest ecoBonusRequest) 
     { 
      UnitOfWork.EcoBonusRequestRepository.InsertEcoBonusRequest(ecoBonusRequest); 
     } 

代碼在BL

public void Save(EcoBonusRequest ecoBonusRequest) 
     { 
      EcoBonusRequestFacade.Save(ecoBonusRequest); 

} 


**Code in the page.aspx.cs, as you can see the element ecobonusworkflow is neverstored in the database, but the navigation entities are stored already.** 

var dealer = DealerBL.GetDealer(Nuteres); 
    var requester = RequesterBL.GetRequester(int.Parse(DdlRequester.SelectedItem.Value)); 
       var selectedVehicle = VehicleBL.GetVehicle(VehicleInformationControl.Chassis); 


var ecoBonusWorkflow = new EcoBonusRequest 
       { 
        IsOnHold = true, 
        AmmountWithoutVAT = decimal.Parse(TxtVatExcluded.Text), 
        AmmountWithVAT = decimal.Parse(TxtVatIncluded.Text), 
        BrandReturnedVehicle = TxtBrandReturnedVehicle.Text, 
        ChassisReturnedVehicle = TxtChasisReturnedVehicle.Text, 
        Percentage = (decimal.Parse(TxtVatExcluded.Text)/VehicleInformationControl.InvoicedAmmount)*100, 
        Comments = TxtComments.Text, 
        Customer = new Customer 
        { 
         FirstName = TxtFirstName.Text, 
         LastName = TxtLastName.Text, 
         Address = new Address 
         { 
          Street = TxtStreet.Text, 
          Number = TxtNumber.Text, 
          Box = TxtBox.Text, 
          City = TxtCity.Text, 
          Zip = TxtZip.Text 
         } 
        }, 
        CurrentStatus = "Approval1", 
        Dealer = dealer, 
        Requester = requester, 
        VehicleDesctructionDate = DateTime.Parse(TxtVehicleDestructionDateReturnedVehicle.Text, userCulture), 
        DestructionCertificateNumberReturnedVehicle = TxtDestructionCertificateNumberReturnedVehicle.Text, 
        TypeReturnedVehicle = TxtTypeReturnedVehicle.Text, 
        Vehicle = selectedVehicle 
       }; 
       EcoBonusRequest = ecoBonusWorkflow; 
       UploadFiles(); 
       RedirectToPage("~/Requests/confirmation.aspx"); 
+0

你從哪裏得到'ecoBonusRequest'來保存?它是從數據庫加載的嗎? –

+0

請參閱更新。 –

+0

也許我需要先添加地址實體,然後添加客戶對象,然後添加ecobonus請求對象,否則EF會自動處理這個問題? –

回答

0

該異常指出您的實體或根實體的導航實體已經連接到另一個上下文。 根據您的體系結構,您應該創建一個新的上下文並且每次都附上它;或者如果您重複使用上下文,則應使用新值刷新上下文。

就你而言,看起來你正在創建一個新的上下文,但是前一個上下文還沒有被處理,因此實體仍然附着在舊的上下文中。在這種情況下,只需重新使用舊的上下文,而不是創建新的上下文。

+0

在我的場景中,一個對象是在頁面中創建的,內存中沒有任何內容,然後將其保存到會話中,然後在第二個頁面中調用Confirmation,它從會話中獲取對象,顯示用戶鍵入的所有信息第一頁,當用戶提交時,它會將該對象添加到數據庫中,在第一頁我從未使用過上下文。你能通過代碼告訴我解決方案嗎? –

+0

再次閱讀,我創建的實體不在數據庫中,但導航實體存儲在數據庫中,所以這可能是問題,我仍然不知道如何通過代碼解決這個問題。 –

+0

你在哪裏將導航屬性附加到根對象? – daryal

相關問題