Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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# 如何将1:1关联建模为类_C#_Entity Framework - Fatal编程技术网

C# 如何将1:1关联建模为类

C# 如何将1:1关联建模为类,c#,entity-framework,C#,Entity Framework,我和ASP.NETMVC遇到了一个我不知道如何解决的问题 我有一个车型等级 VehicleId Register .... Etc 还有一个司机班 DriverId FirstName LastName 我想创建一个新表,以便控制哪辆车有一个驾驶员,而每辆车不能有多个驾驶员 我想用车辆和驾驶员的钥匙创建一个表DriverHicle。任何与此相关的帮助都将是巨大的帮助。我正在使用ASP.NETMVC和EF 将DriverId添加为车辆表中的外来列,并为驾驶员添加虚拟车辆列表。因此,每辆车将

我和ASP.NETMVC遇到了一个我不知道如何解决的问题

我有一个车型等级

VehicleId
Register
.... Etc
还有一个司机班

DriverId
FirstName 
LastName 
我想创建一个新表,以便控制哪辆车有一个驾驶员,而每辆车不能有多个驾驶员


我想用车辆和驾驶员的钥匙创建一个表DriverHicle。任何与此相关的帮助都将是巨大的帮助。我正在使用ASP.NETMVC和EF

将DriverId添加为车辆表中的外来列,并为驾驶员添加虚拟车辆列表。因此,每辆车将有一名驾驶员,每个驾驶员可以驾驶多辆车

车辆等级

public virtual Driver Driver { get;set; }
public virtual int DriverId { get;set; }    //make it null if you think some vechile dont have driver
驾驶员等级

public virtual IList<Vehicle> Vehicles { get;set; }
公共虚拟IList车辆{get;set;}

您正在寻找的是独立实体之间的一种相互可选的1:1关联(更确切地说是:0..1-0..1)。正如我所解释的,EF在这里并没有真正的帮助,但是有一些选择

第一个选项是使用1-0..1关联进行结算,EF完全支持该关联。但是
Car
Driver
应该有一个指向其他实体的主键。据我所知,这不是你想要的。您希望两个实体能够独立于另一个实体而存在

所以,正如您所描述的,唯一的选择是引入第三个实体,也就是连接类。现在,实体框架只支持多对多关联,而不支持1:1。因此,您必须将关联映射为多对多,但要采取一些特殊措施防止两端重复关联

为了实现这一目标,我提出了以下建议:

public class Car
{
    public Car()
    {
        CarDrivers = new HashSet<CarDriver>();
    }
    public int CarId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<CarDriver> CarDrivers { get; set; }
}

public class Driver
{
    public Driver()
    {
        CarDrivers = new HashSet<CarDriver>();
    }
    public int DriverId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<CarDriver> CarDrivers { get; set; }
}

public class CarDriver
{
    [Key, Column(Order = 0), Index(IsUnique = true)]
    public int CarId { get; set; }
    [Key, Column(Order = 1), Index(IsUnique = true)]
    public int DriverId { get; set; }
    public Car Car { get; set; }
    public Driver Driver { get; set; }
}
公车
{
公共汽车
{
CarDrivers=newhashset();
}
public int CarId{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection{get;set;}
}
公务舱司机
{
公共司机()
{
CarDrivers=newhashset();
}
public int DriverId{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection{get;set;}
}
公共级CarDriver
{
[键,列(顺序=0),索引(IsUnique=true)]
public int CarId{get;set;}
[键,列(顺序=1),索引(IsUnique=true)]
public int DriverId{get;set;}
公共小汽车{get;set;}
公共驱动程序{get;set;}
}
这是一个显式的多对多关联(即具有可见的连接类),但由于
CarDriver
中两个外键上的唯一索引,两端都限制为1

因此,至少在数据库端,关联的适当多重性被强制执行。但是,在您的代码中,没有什么可以阻止您向
CarDrivers
集合添加多个
CarDrivers
。这将抛出一个难看的数据库约束错误,因此您必须使用自定义验证来保护它