C# 需要处理EF核心中的一对多
我需要处理一对多的情况。下面是我面临的一个非常接近的情况 场景是:C# 需要处理EF核心中的一对多,c#,entity-framework,asp.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,Entity Framework Core,我需要处理一对多的情况。下面是我面临的一个非常接近的情况 场景是:汽车可以有许多车主,但在任何时间点都只有一个车主。下文显示了idea的实体,其中包含最少的信息 public class Car { public int CarId { get; set; } public ICollection<Owner> Owners { get; set; } } public class Owner { public int OwnerId { get; set;
汽车
可以有许多车主
,但在任何时间点都只有一个车主。下文显示了idea的实体,其中包含最少的信息
public class Car
{
public int CarId { get; set; }
public ICollection<Owner> Owners { get; set; }
}
public class Owner
{
public int OwnerId { get; set; }
public string nic { get; set; }
}
如果NIC已更改,我想在
车主中插入一个新行。您的汽车是否始终有车主,或者汽车是否有车主历史记录而没有当前车主?如果您的汽车始终只有一位车主,您可以创建一个具有三个属性的子集合History
,OwnerId
和Timestamp
。当前所有者通常会选择具有最高时间戳的条目
如果可能的话,一辆车有车主的历史记录,但没有当前车主,那么您应该向该车添加一个属性CurrentOwnerId
,该属性可以为空,从而使一辆车有老车主的历史记录,但没有当前车主。如果您执行以下操作
public class Car
{
public int CarId{ get; set; }
public Owner CurrentOwner { get; set; }
public ICollection<Owner> PreviousOwners { get; set; }
}
公车
{
public int CarId{get;set;}
公共所有者CurrentOwner{get;set;}
public ICollection PreviousOwners{get;set;}
}
EF将整理这两个实体之间的多对多映射。您将不得不在业务层中自己添加一个新的所有者,因为这似乎是一个业务规则
如果NIC被更改,我想在车主中插入一个新行
我创建了一个简单的演示,从视图中提交车主
,并插入一个新的车主
型号:
public class Car
{
public int CarId { get; set; }
public ICollection<Owner> Owners { get; set; }
}
public class Owner
{
public int OwnerId { get; set; }
public int CarId { get; set; }
public string nic { get; set; }
}
public class CarOwner
{
public int CarID { get; set; }
public string OwnerNIC { get; set; }
}
公车
{
public int CarId{get;set;}
公共ICollection所有者{get;set;}
}
公共类所有者
{
public int OwnerId{get;set;}
public int CarId{get;set;}
公共字符串nic{get;set;}
}
公营车主
{
public int CarID{get;set;}
公共字符串所有者{get;set;}
}
行动:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> TestCar([Bind("CarID,OwnerNIC")] CarOwner carOwner )
{
if (ModelState.IsValid)
{
var owner = new Owner()
{
CarId = carOwner.CarID,
nic = carOwner.OwnerNIC
};
_context.Add(owner);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(carOwner);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务TestCar([Bind(“CarID,OwnerNIC”)]CarOwner
{
if(ModelState.IsValid)
{
var owner=新所有者()
{
CarId=carOwner.CarId,
nic=carOwner.OwnerNIC
};
_添加(所有者);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
返回视图(车主);
}
我正在所有者表中维护时间戳。但是我没有表现出来。。我想问的是,如果一个请求附带一辆拥有新NIC的汽车,那么我应该如何在车主表中插入新行,否则我将使用车主表更新详细信息如果现有汽车附带新车主信息,您将如何管理。如果CurrentOwner信息已更改,请添加新的所有者。旧的将出现在以前的所有者中。仅使用数据模型无法解决此问题。因为这是应用程序的一条规则,所以更新汽车和车主的业务逻辑需要处理它。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> TestCar([Bind("CarID,OwnerNIC")] CarOwner carOwner )
{
if (ModelState.IsValid)
{
var owner = new Owner()
{
CarId = carOwner.CarID,
nic = carOwner.OwnerNIC
};
_context.Add(owner);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(carOwner);
}