ASP.NET MVC和我遇到了一个我不知道如何解决的问题
我在模型中有一个Vehicle类
DriverId
FirstName
LastName
和一个驱动程序类
{{1}}
我想创建一个新表来控制哪辆车有一个驱动程序,其中每辆车不能有多个驱动程序
我想用Vehicle和Driver创建一个表DriverVehicle。任何与此相关的帮助都将是一个很大的帮助。我正在使用ASP.NET MVC和EF。
答案 0 :(得分:2)
您正在寻找的是独立实体之间相互可选的1:1关联(更确切地说:0..1-0..1)。正如我解释here,EF在这里并不是很有用,但有一些选择。
第一种选择是以1-0..1关联来解决,这完全由EF支持。但Car
或Driver
应该有一个主键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; }