需要在EF Core中一对多处理

时间:2019-12-13 11:30:49

标签: c# entity-framework asp.net-core entity-framework-core

我需要处理一对多的情况。下面是我面临的一个非常接近的场景。

方案是: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所有者中插入新行。

3 个答案:

答案 0 :(得分:0)

您的汽车是否始终拥有所有者,或者汽车是否具有所有者历史且没有当前所有者?如果您的汽车始终只有一个所有者,则可以创建一个具有三个属性HistoryCarIdOwnerId的子集合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);
    }