【问题标题】:How to add a partial entry into relational DB with entity core如何使用实体核心将部分条目添加到关系数据库中
【发布时间】:2020-12-08 11:52:51
【问题描述】:

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

模型
ClientDetails, ClientVehicle, ClientOrder

关系:

  • 1 个客户可以拥有许多车辆
  • 一辆车可以有多个订单

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

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

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

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

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

有问题的代码片段

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

【问题讨论】:

  • 发布您的模型。我们不知道哪个是主类或子类。
  • 如果我不明白,我很抱歉,但关系没有回答吗? ClientDetails为主模型,ClientVehicle依赖ClientDetails,ClientOrder依赖ClientVehicle。

标签: c# mysql entity-framework-core foreign-keys relational-database


【解决方案1】:

试试这个

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

【讨论】:

  • 嗨@Asherguru,这行得通!我将在一秒钟内将其更新为答案。只是复制差异实例的逻辑。谢谢男人/wham :)
  • 我在几个嵌套场合复制了它并在需要的地方进行了调整,它完美地工作!非常感谢,在这方面苦苦挣扎了一段时间。
猜你喜欢
  • 2013-12-03
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多