【问题标题】:How to model a 1:1 association as class如何将 1:1 关联建模为类
【发布时间】:2017-01-01 09:42:01
【问题描述】:

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

我在模型中有一个 Vehicle 类

VehicleId
Register
.... Etc

还有一个驱动类

DriverId
FirstName 
LastName 

我想创建一个新表来控制哪些车辆有一个司机,而每辆车不能有多个司机

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

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

    因此,正如您所描述的,唯一的选择是引入第三个实体,也就是 连接类。现在,Entity Framework 仅支持多对多关联,而不支持 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 中两个外键上的唯一索引限制两端为 1。

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

    【讨论】:

      【解决方案2】:

      在 Vehicle 表中添加 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; }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 2012-03-18
        • 2016-12-24
        相关资源
        最近更新 更多