如何使用实体核心将部分条目添加到关系数据库中

How to add a partial entry into relational DB with entity core

程序:
我的程序从文件中读取,然后将值存储在关系数据库中。

模特
ClientDetails、ClientVehicle、ClientOrder

关系:

问题:
程序不支持重复数据。

奋斗
如果客户端已经存在但我需要能够不添加客户端,但在存储车辆时仍然将客户端链接到车辆(实体核心为我处理外键,但是当简单地跳过一半记录时我得到外键约束).如果添加具有相同牌照的车辆,则需要执行相同的过程。

斗争仍在继续
为了解决这个问题,我还需要能够对文件本身进行这些检查,因为我只在整个过程结束时将上下文更改保存到数据库中,所以如果文件包含 2 条记录,用户相同但车辆不同(1个客户可以有很多辆车)那么我只需要添加一次用户。

希望
我希望有人可以告诉我是否有内置的实体核心方法可以为我解决这个问题。我已经看到一些 entity framework 东西,我估计可以解决这个问题,但我找不到等效的实体核心。例如 _context.AddIfNotExists。或者类似 _context.AddOrUpdate(entity, k = k.id = record[0]) 的内容。如果这样的 post 已经存在,请指导我,因为我自己找不到它。

注意
当发现重复的客户时,条目的其余部分仍应发生,因为这是一个“订单”,它只是需要跳过的客户(或车辆,如果车牌相同)。

有问题的代码片段

public void LoadCsv(string path)
    {
        var lines = File.ReadAllLines(path).Where(x => !string.IsNullOrWhiteSpace(x));
        _now = DateTime.Now;
        var count = 0;
        foreach (var line in lines)
        {
            if (count > 0)
            {
                var record = line.Split('|').ToList();

                var entityClientDetails = AddClientDetails(record, _now);
                var entityClientVehicle = AddClientVehicle(record, _now);
                var entityClientOrder = AddClientOrder(record, _now);
                entityClientDetails.ClientVehicles.Add(entityClientVehicle);
                entityClientVehicle.ClientOrders.Add(entityClientOrder);
                _context.Add(entityClientDetails);
            }
            count++;
        }
        _context.SaveChanges();
    }

试试这个

public void LoadCsv(string path)
    {
        var clients = _context.ClientDetails.AsQueryable();
        var lines = File.ReadAllLines(path).Where(x => !string.IsNullOrWhiteSpace(x));
        _now = DateTime.Now;
        var count = 0;
        foreach (var line in lines)
        {
            if (count > 0)
            {
                var record = line.Split('|').ToList();

                var entityClientDetails = AddClientDetails(record, _now);
                var entityClientVehicle = AddClientVehicle(record, _now);
                var entityClientOrder = AddClientOrder(record, _now);

                var clientExist = clients.Where(x => x.RegistrationPlate == entityClientDetails.RegistrationPlate).FirstOrDefault();
                entityClientVehicle.ClientOrders.Add(entityClientOrder);

                if (clientExist != null)
                {
                      entityClientVehicle.ClientDetailID = clientExist.Id;
                      _context.Add(entityClientVehicle);
                }
                else
                {
               entityClientDetails.ClientVehicles.Add(entityClientVehicle);
                      _context.Add(entityClientDetails);
                }
            }
            count++;
        }
        _context.SaveChanges();
    }