Как вставить граф в Entity Framework с круговой зависимостью - PullRequest
1 голос
/ 17 июня 2020

Вот как выглядит структура базы данных:

Vehicle имеет лот CanNetworks и каждый CanNetwork имеет лот ECUs. И это было бы отлично, если бы это было только у меня.

Но каждый vehicle также имеет один специальный ECU, называемый gatewayECU, поэтому проблема возникает с сохранением, потому что ядро ​​Entity Framework не знает, как справиться с этим сценарием . Ему нужно вставить автомобиль перед вставкой электронного блока управления, но как вставить автомобиль, когда блок управления не вставлен. вставьте весь график, а затем обновите транспортное средство с помощью поля gatewayEcuId, которое я сохранил в некоторой переменной, прежде чем что-либо делать.

Решение не очень хорошее. Как справиться с этим сценарием.

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!;
}

Это уродливое решение, которое мне не нужно:

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;
}

EDIT: Теперь я думаю о смене таблицы структура таким образом, чтобы избавиться от поля gatewayECU на Vehicle, и поставить флаг IsGatewayEcu в таблицу ECU

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...