首页 > 解决方案 > EF 6 的 C# Unity.Webapi 依赖注入“一个实体对象不能被多个 IEntityChangeTracker 实例引用”

问题描述

所以我使用 Unity.Webapi 作为我的 DI https://www.nuget.org/packages/Unity.WebAPI/

我在保存“实体不能被多个 IEntityChangeTracker 实例引用”时随机收到此错误

我认为问题是我如何将我的 Di 配置为注入我的数据库上下文

这是我的 Global.asax => 应用程序开始

protected void Application_Start()
    {
      AreaRegistration.RegisterAllAreas();
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      UnityConfig.RegisterComponents();// this is the IOC DI for ENTITY FRAMEWORK SERVICES
      GlobalConfiguration.Configure(WebApiConfig.Register);

    

统一配置

public static class UnityConfig
  {
    public static void RegisterComponents()
    {
      UnityContainer container = new Unity.UnityContainer();
      container.EnableDiagnostic();
      var context = new EveModel();
      container.RegisterType<IRiskTypeRepo, RiskTypeRepo>(new InjectionConstructor(context));
      container.RegisterType<IRiskMatrixRepo, RiskMatrixRepo>(new InjectionConstructor(context));
      container.RegisterType<IRiskClosedReasonRepo, RiskClosedReasonRepo>(new InjectionConstructor(context));
      container.RegisterType<IRiskIssueManagementStrategyTypeRepo, RiskIssueManagementStrategyTypeRepo>(new InjectionConstructor(context));
      container.RegisterType<RiskMitigationStatusRepo.IRiskMitigationStatusRepo, RiskMitigationStatusRepo>(new InjectionConstructor(context));
      container.RegisterType<IRapidUserRepository, RapidUserRepo>(new InjectionConstructor(context));
      container.RegisterType<IRelMeasureRiskMitigationRepo, RelMeasureRiskMitigationRepo>();
      container.RegisterType<IRiskMitigationRepo, RiskMitigationRepo>(new InjectionConstructor(context));
      container.RegisterType<IRiskMitigationService, RiskMitigationService>();
      container.RegisterType<IMeasureRepo, MeasureRepo>(new InjectionConstructor(context));
      container.RegisterType<IMeasureService, MeasureService>();
      container.RegisterType<InitiativeRepo, InitiativeRepo>(new InjectionConstructor(context));
      container.RegisterType<IInitiativeService, InitiativeService>();
      container.RegisterType<IRiskMitigationService, RiskMitigationService>();
      container.RegisterType<IRiskRepository, RiskRepo>(new InjectionConstructor(context));
      container.RegisterType<IRiskService, RiskService>();    
      GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
    }
  }

RM回购

using AuditWeb.Data.CodeFirst;
using AuditWeb.Data.Repos.Concrete;
using AuditWeb.Data.Repos.Contracts;
using AuditWeb.Data.Repos.LookUpRepositories;
using AuditWeb.Service.JsonModels;
using AuditWeb.Service.Services.Contracts;
using AuditWeb.Service.Services.Contracts.Base;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;

namespace AuditWeb.Service.Services.Concrete
{
    public class RiskMitigationService : IRiskMitigationService
    {
        private readonly IRiskMitigationRepo riskMitigationRepo;
        private readonly IMeasureService measureService;
        private readonly IUserRepository UserRepo;
        private readonly IRelMeasureRiskMitigationRepo relMeasureRmRepo;
        private readonly IRiskRepository riskRepo;
        private readonly DateTime currentTime;
        private readonly RiskMitigationStatusRepo.IRiskMitigationStatusRepo luRiskMigitgationStatus;
        private readonly IRiskIssueManagementStrategyTypeRepo luRiskManagementStrategyType;
        private User currentUser;
        public int currentUserId { get; set; } = 0;
        public RiskMitigationService(IRiskMitigationRepo _riskMitigationRepo
 
            , IRiskRepository _riskRep
            , IMeasureService _measureService
            , IUserRepository _UserRepo
            , RelMeasureRiskMitigationRepo _rmrmRepo
            , RiskMitigationStatusRepo.IRiskMitigationStatusRepo _luRiskMigitgationStatus
             , IRiskIssueManagementStrategyTypeRepo _luRiskManagementStrategyType
            )
        {
            riskMitigationRepo = _riskMitigationRepo;
            riskRepo = _riskRep;
            measureService = _measureService;
            currentTime = DateTime.Now;
            UserRepo = _UserRepo;
            relMeasureRmRepo = _rmrmRepo;
            luRiskMigitgationStatus = _luRiskMigitgationStatus;
            luRiskManagementStrategyType = _luRiskManagementStrategyType;
        }
        private RelMeasureRiskMitigation CreateNewMeasure() {

        return   new RelMeasureRiskMitigation()
            {
                //MeasureId = MeasureId, 
                //RiskMitigationId = obj.Id > 0 ? obj.Id : rm.Id,
                CreatedBy = this.currentUserId,
                LastModifiedBy = this.currentUserId,
                UpdatedTimestamp = currentTime,
                CreatedTimestamp = currentTime,
                CreatedByUser = currentUser,
                LastModifiedByUser = currentUser,
                ActiveFlag = true,
                DisplayFlag = false,
                Version = 1
            };
        }
        public RiskMitigation SaveUpdate(RiskMitigationJsonModel obj)
        {
            currentUser = UserRepo.GetById(this.currentUserId);
            RiskMitigation rm;
            if (obj.Id > 0)
            {
                rm.RiskId = obj.RiskId;
                rm.Owner = obj.OwnerId;
                rm.RiskMitigationStatusId = obj.MitigationStatusId;
                rm = UpdateStatus(rm, rm.ActiveFlag);
            }
            else
            {
                rm = ToBo(obj);
                 
            } 
            var rm1 = riskMitigationRepo.Save(rm);
            int totalCnt = relMeasureRmRepo.Count(s =>
              s.MeasureId == 102 && s.RiskMitigationId == obj.Id);
            int recCtn = 0;
            bool exists = false;    
            RelMeasureRiskMitigation newRel;
            foreach (int MeasureId in obj.RelMeasureMitigationIds)
            {
                if (rm.RelMeasureRiskMitigation.Any(s => s.MeasureId == MeasureId && s.RiskMitigationId == rm.Id))
                {
                    recCtn = rm.RelMeasureRiskMitigation.Count(s => s.MeasureId == MeasureId);
                    newRel = rm.RelMeasureRiskMitigation
                        .OrderByDescending(s => s.Id)
                        .Where(s => s.MeasureId == MeasureId).Take(1).Single();
                    if (!newRel.ActiveFlag)
                    {
                        newRel.ActiveFlag = true;
                        newRel.LastModifiedBy = this.currentUserId;
                        newRel.UpdatedTimestamp = currentTime;
                        newRel.Version++;
                    }
                }
                else
                {
                    newRel = CreateNewMeasure();
                    newRel.MeasureId = MeasureId;
                    newRel.Id = obj.Id > 0 ? obj.Id : rm.Id;
                    newRel.RiskMitigation = rm;
                    newRel.Measure = measureService.GetById(MeasureId);
                }
                try {   relMeasureRmRepo.Save(newRel);}
                catch (SqlException sqlex)              {}

                catch (Exception ex)    {}
            }
            return rm1;
        }
        private RiskMitigation ToBo(RiskMitigationJsonModel obj)
        {

            var owner = UserRepo.GetById(obj.OwnerId);
            try
            {
                var stratType = luRiskManagementStrategyType.GetById(obj.RiskIssueManagementStrategyTypeId);
                var status = luRiskMigitgationStatus.GetById(obj.MitigationStatusId);
                Risk risk = riskRepo.GetById(obj.RiskId);

                User approvedByAamdUser = null;
                User approvedByPmoUserId = null;
                if (obj.ApprovedByAamdUserId != null) {
                    approvedByAamdUser = UserRepo.GetById((int)obj.ApprovedByAamdUserId);
                }
                if (obj.ApprovedByPmoUserId != null)
                {
                    approvedByPmoUserId = UserRepo.GetById((int)obj.ApprovedByPmoUserId);
                }
                return new RiskMitigation()
                {
                    TrackingNumber =  obj.Id == 0   ? riskMitigationRepo.GenerateTrackingNumber(risk.OrganizationId, "RM") : "",
                    CreatedByUser = currentUser,
                    LastModifiedByUser = currentUser,
                    Id = 0,
                    UpdatedTimestamp = currentTime,
                    CreatedTimestamp = currentTime,
                    ActiveFlag = true,
                    CreatedBy = currentUserId,
                    LastModifiedBy = currentUserId,
                    Version = 1,
                    RiskManagementStrategyTypeId = obj.RiskIssueManagementStrategyTypeId,
                    RiskMitigationStatusId = obj.MitigationStatusId,
                    Actions = obj.Actions ?? "",
                    AnticipatedStartDate = obj.AnticipatedStartDate,
                    ApprovedByPmoUserId = obj.ApprovedByPmoUserId,
                    ApprovedByPmoUser = approvedByPmoUserId,
                    ApprovedByAamdFlag = obj.ApprovedByAamdFlag ?? false,
                    ApprovedByAamdTimestamp = obj.ApprovedByAamdTimestamp,
                    ApprovedByAamdUser = approvedByAamdUser,
                    ApprovedByPmoFlag = obj.ApprovedByPmoFlag ?? false,
                    ApprovedByAamdUserId = obj.ApprovedByAamdUserId,
                    ApprovedByPmoTimestamp = obj.ApprovedByPmoTimestamp,
                    ImpactStatement = obj.ImpactStatement ?? "",
                    Notes = obj.Notes ?? "",
                    Strategy = obj.Strategy ?? "",
                    RiskId = obj.RiskId,
                    Risk = risk,
                    Owner = obj.OwnerId,
                    OwnerUser = owner,
                    LuRiskMitigationStatus = status,
                    LuRiskManagementStrategyType = stratType
                };
            }
            catch (Exception exeption)
            {
                throw exeption;
            }
        }
    }
}

标签: c#dependency-injectionweb-applicationsentity-framework-6webapi

解决方案


推荐阅读