Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要处理EF核心中的一对多_C#_Entity Framework_Asp.net Core_Entity Framework Core - Fatal编程技术网

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