我需要处理一对多的情况。下面是我面临的一个非常接近的场景。
方案是:Car
可以有多个Owners
,但是在任何时间点只有一个所有者。下面显示了实体,以提供最少的信息。
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; }
}
商业模式:
public class CarOwner
{
public int CarID { get; set; }
public string OwnerNIC { get; set; }
}
如果更改了NIC,我想向Car
所有者中插入新行。
答案 0 :(得分:0)
您的汽车是否始终拥有所有者,或者汽车是否具有所有者历史且没有当前所有者?如果您的汽车始终只有一个所有者,则可以创建一个具有三个属性History
,CarId
和OwnerId
的子集合Timestamp
。当前所有者将比以往总是具有最高时间戳。
如果可能的话,汽车具有拥有者的历史,但没有当前拥有者,则应在汽车中添加一个属性CurrentOwnerId
,该属性可以为空,这样可以使汽车拥有有旧所有者的历史,但没有当前所有者。
答案 1 :(得分:0)
如果您执行以下操作
public class Car
{
public int CarId{ get; set; }
public Owner CurrentOwner { get; set; }
public ICollection<Owner> PreviousOwners { get; set; }
}
EF将整理出两个实体之间的多对多映射。您将不得不进行NIC更改,在您的业务层中自己添加一个新的所有者,因为这似乎是一条业务规则。
答案 2 :(得分:0)
如果更改了NIC,我想在“车主”中插入新行。
我创建了一个简单的演示,该演示从视图中提交了CarOwner
并插入了一个新的Owner
。
型号:
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; }
}
操作:
[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);
}