问题描述
程序:
我的程序从文件读取,然后将值存储在关系数据库中。
模型
ClientDetails,ClientVehicle,ClientOrder
关系:
- 1个客户可以拥有很多车辆
- 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();
}
解决方法
尝试一下
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();
}