C# unitofwork和repositorypattern一个实体对象不能被IEntityChangeTracker的多个实例引用

C# unitofwork和repositorypattern一个实体对象不能被IEntityChangeTracker的多个实例引用,c#,entity-framework,c#-4.0,entity-framework-4.1,C#,Entity Framework,C# 4.0,Entity Framework 4.1,我有一个复杂的对象,它引用了其他对象,我试图从我的web应用程序中保存它 因此,在我的webapplication中,我调用业务逻辑,从bl中,我调用DAL Facade,然后调用DAL 当我执行Insert方法时,我遇到了异常 DAL层中的代码,这是引发异常的地方 Unitofwork.cs中的代码 dal外观中的代码: BL中的代码 该异常表示您的实体或根实体的导航实体已附加到另一个上下文。 根据您的体系结构,您应该创建一个新的上下文并每次附加它;或者,如果要重用上下文,则应使用新值刷新上下

我有一个复杂的对象,它引用了其他对象,我试图从我的web应用程序中保存它

因此,在我的webapplication中,我调用业务逻辑,从bl中,我调用DAL Facade,然后调用DAL

当我执行Insert方法时,我遇到了异常

DAL层中的代码,这是引发异常的地方

Unitofwork.cs中的代码

dal外观中的代码:

BL中的代码


该异常表示您的实体或根实体的导航实体已附加到另一个上下文。 根据您的体系结构,您应该创建一个新的上下文并每次附加它;或者,如果要重用上下文,则应使用新值刷新上下文


在您的情况下,您似乎正在创建一个新的上下文,但以前的上下文尚未被处理,因此实体仍然附加到旧的上下文。在这种情况下,只需重新使用旧的上下文,而不是创建新的上下文。

您从哪里获得要保存的ecoBonusRequest?它是从数据库加载的吗?可能我需要先添加地址实体,然后是客户对象,然后是ecobonus请求对象,或者EF会自动处理这个问题?错误会在这一行上抛出:在DAL public void inserteCobonsRequesteCobonsRequest ecoBonusRequest上{{u context.EcoBonusRequests.addecobonusrequests;在我的场景中,在一个页面中创建一个对象,在内存中不附加任何内容,然后将其保存到会话中,然后在第二个页面(称为确认)中,它从会话中获取该对象,显示用户在第一个页面上键入的所有信息,当用户提交时,它将显示d数据库的对象,在第一页中,我从未使用过上下文。你能通过代码告诉我解决方案吗?再次阅读,我创建的实体不在数据库中,但导航实体存储在数据库中,因此这可能是问题所在,我仍然不知道如何通过代码解决。你在哪里附加导航属性s到根对象?在page.aspx.cs中,请查看更新,经销商和请求者是数据库中已经存在的导航属性,ecobonusrequest当时在内存中。您是使用同一个DealerBL实例保存实体,还是使用另一个BL?
public void InsertEcoBonusRequest(EcoBonusRequest ecoBonusRequest)
        {
            _context.EcoBonusRequests.Add(ecoBonusRequest);
        }
public void Save()
        {
            _context.SaveChanges();
        }

 private RequestBaseRepository _requestBaseRepository;

 public EcoBonusRequestRepository EcoBonusRequestRepository
            {
                get
                {
                    return _ecobonusworkflowRepository ??
                            (_ecobonusworkflowRepository = new EcoBonusRequestRepository(_context));
                }
            }
private  static readonly UnitOfWork UnitOfWork = new UnitOfWork();

        public void Save(EcoBonusRequest ecoBonusRequest)
        {
            UnitOfWork.EcoBonusRequestRepository.InsertEcoBonusRequest(ecoBonusRequest);
        }
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");