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

时间:2017-01-01 09:42:01

标签: c# entity-framework

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

我在模型中有一个Vehicle类

DriverId
FirstName 
LastName 

和一个驱动程序类

{{1}}

我想创建一个新表来控制哪辆车有一个驱动程序,其中每辆车不能有多个驱动程序

我想用Vehicle和Driver创建一个表DriverVehicle。任何与此相关的帮助都将是一个很大的帮助。我正在使用ASP.NET MVC和EF。

2 个答案:

答案 0 :(得分:2)

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

第一种选择是以1-0..1关联来解决,这完全由EF支持。但CarDriver应该有一个主键also a foreign key到另一个实体。从我读到的,这不是你想要的。您希望两个实体能够独立于另一个实体存在。

因此,正如您所描述的那样,唯一的选择是引入第三个实体,即连接类。现在,实体框架仅支持多对多关联,而不是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; }
}

这是一个明确的多对多关联(即具有可见的联结类),但在CarDriver的两个外键上的唯一索引限制为两端。

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

答案 1 :(得分:0)

将DriverId添加为Vehicle表中的外部列,并为驱动程序添加Vehicle的虚拟列表。所以每辆车都有单个驾驶员,每个驾驶员都可以驾驶许多车辆。

车辆类

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