Вот как выглядит структура базы данных:
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