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

,这对于单个
保存更改
,没有解决方案,因此更改模型以避免循环引用应该是最好的。对于单个
保存更改
,没有解决方案,因此,最好更改模型以避免循环引用。