2012-05-22 48 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

相关问题