C# 如何在具有循环依赖关系的实体框架中插入图形
以下是数据库结构的外观:C# 如何在具有循环依赖关系的实体框架中插入图形,c#,entity-framework,entity-framework-core,ef-core-3.1,C#,Entity Framework,Entity Framework Core,Ef Core 3.1,以下是数据库结构的外观: 车辆有很多网络,每个网络都有很多ECU。如果这是我唯一拥有的,那就省钱了 但是,每个车辆也有一个名为网关ECU的特殊ECU,因此在保存时会出现问题,因为实体框架核心不知道如何处理该场景。在插入ecu之前需要插入车辆,但在未插入ecu时如何插入车辆 这就是我尝试的:忽略(删除,失效)gatewayecu字段(数据库中的列可为空),然后插入整个图形,然后在执行任何操作之前使用存储在某个变量中的gatewayecu字段更新车辆 解决方案并不漂亮。如何处理这种情况 public
车辆
有很多网络
,每个网络
都有很多ECU
。如果这是我唯一拥有的,那就省钱了
但是,每个车辆
也有一个名为网关ECU
的特殊ECU,因此在保存时会出现问题,因为实体框架核心不知道如何处理该场景。在插入ecu之前需要插入车辆,但在未插入ecu时如何插入车辆
这就是我尝试的:忽略(删除,失效)gatewayecu字段(数据库中的列可为空),然后插入整个图形,然后在执行任何操作之前使用存储在某个变量中的gatewayecu字段更新车辆
解决方案并不漂亮。如何处理这种情况
public class Vehicle : BaseEntity
{
public Vehicle()
{
CANNetworks = new List<CANNetwork>();
}
public List<CANNetwork>? CANNetworks { get; set; }
public ECU? GatewayECU { get; set; } = default!;
public int? GatewayECUId { get; set; }
}
public class CANNetwork : BaseEntity
{
public CANNetwork()
{
ECUs = new List<ECU>();
}
public string Name { get; set; } = default!;
public ICollection<ECU>? ECUs { get; set; }
public int VehicleId { get; set; }
public Vehicle? Vehicle { get; set; } = default!;
}
public class ECU : BaseEntity
{
public int CANNetworkId { get; set; }
public CANNetwork? CANNetwork { get; set; } = default!;
}
公共类车辆:基本实体
{
公共车辆()
{
CANNetworks=新列表();
}
公共列表?网络{get;set;}
公共ECU?网关ECU{get;set;}=default!;
公共int?网关ecuid{get;set;}
}
公共类网络:BaseEntity
{
公共网络
{
ECUs=新列表();
}
公共字符串名称{get;set;}=default!;
公共ICollection?ECUs{get;set;}
public int VehicleId{get;set;}
公共车辆?车辆{get;set;}=默认值!;
}
公共类ECU:BaseEntity
{
公共int CANNetworkId{get;set;}
公共网络?网络{get;set;}=default!;
}
这是我不想要的丑陋的解决方案:
public async Task<int> Insert(Vehicle vehicleDefinition, ECU vehicleGatewayECU)
{
var result = -1;
using (var transaction = _databaseContext.Database.BeginTransaction())
{
result = await Insert(vehicleDefinition);
if (vehicleGatewayECU != null)
{
var ecu = await _databaseContext.ECUs.FirstOrDefaultAsync(x => x.Name == vehicleGatewayECU.Name && vehicleDefinition.Name == x.CANNetwork.Vehicle.Name);
if (ecu != null)
{
vehicleDefinition.GatewayECUId = ecu.Id;
result = await Update(vehicleDefinition);
transaction.Commit();
return result;
}
}
else
{
transaction.Commit();
}
}
return result;
}
公共异步任务插入(车辆定义,ECU车辆通道ECU)
{
var结果=-1;
使用(var事务=_databaseContext.Database.BeginTransaction())
{
结果=等待插入(车辆定义);
如果(电子控制单元!=空)
{
var ecu=await_databaseContext.ECUs.FirstOrDefaultAsync(x=>x.Name==vehiclatewayecu.Name&&vehicleDefinition.Name==x.CANNetwork.Vehicle.Name);
如果(ecu!=null)
{
vehicleDefinition.GatewayECUId=ecu.Id;
结果=等待更新(车辆定义);
Commit();
返回结果;
}
}
其他的
{
Commit();
}
}
返回结果;
}
编辑:
我现在正在考虑改变表格结构,以消除车辆上的gatewayECU字段,并在ECU表格中添加一些标志IsGatewayEcu,这对于单个
保存更改
,没有解决方案,因此更改模型以避免循环引用应该是最好的。对于单个保存更改
,没有解决方案,因此,最好更改模型以避免循环引用。