c# - 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;
}
}
}
}
解决方案
推荐阅读
- json - 如何在 Postman 中发送表单数据
- tomcat - tomcat重定向端口8443
- c# - PowerShell 脚本无法执行 - Service Fabric
- javascript - Cloud Firestore 可以在 .get() 上正常工作,但不能在 .onSnapshot() 下使用 next.js
- python - 将多个 ggplot 组合成一个图并保存在 Python 中
- reactjs - 无法深层链接到嵌套的 React Native 导航器
- c++ - 为什么我可以自动声明指针而不是数组?
- javascript - 单击菜单内的任何链接时如何关闭全屏菜单?
- arduino - 没有为我的 USBasp AVR 编程器分配 COM 端口
- r - R 函数 paste() 中使用的文本分隔符是什么?