实体框架6中的复合键和使用多列属性

时间:2015-09-28 16:35:51

标签: c# entity-framework entity-framework-6

我正在尝试使用两个字段创建一个复合键,首先将代码用于db中的表中的现有字段;

    [Key,Column("driverId", Order=0)]
    [JsonProperty(PropertyName="driverid")]
    public override int ID { get; set; }

    [Key,Column("type", Order=1)]
    [JsonProperty(PropertyName="typeid")]
    public int Type { get; set; }

现在,当我尝试运行新的迁移时,我收到以下错误;

  

关系约束中的从属角色和主要角色中的属性数必须相同。   DriversToVehicle_Driver_Target_DriversToVehicle_Driver_Source ::关系约束中的从属角色和主要角色中的属性数必须相同。

DriversToVehicle表如下;

public partial class DriversToVehicle
{
    [Column("id"), Key]
    public int ID { get; set; }

    [Column("driverid")]
    public int DriverID { get; set; }
    [ForeignKey("DriverID")]
    public Driver Driver { get; set; }

    [Column("vehicleid")]
    public int VehicleID { get; set; }
    [ForeignKey("VehicleID")]
    public Vehicle Vehicle { get; set; }
}

扩展这个问题,最初是ID上的一个密钥,即

    [Column("driverId")]
    [JsonProperty(PropertyName="driverid")]
    public override int ID { get; set; }

现在向前推进,这将如何影响链接到它的其他实体(我的意思是代码中的代码)?将自动排除这个?或者我现在需要在链接到这个类时在其他实体中同时拥有这两个键吗?

e.g。和以前一样,我会有

public virtual Driver myDriver;

显然现在不需要单独链接ID,而是需要与Type链接。

提前致谢。

编辑答案

好的,我把Type输出到了一个单独的类。现在的主要问题是如何将外键标记为复合键?

我有以下课程

    public partial class DriverType 
    {
        [Column("Id")]
        [JsonProperty(PropertyName = "drivertypeid")]
        public override int ID { get; set; }

        [JsonProperty(PropertyName = "drivertype")]
        public string Name { get; set; }
    }

然后在驱动程序中,我有以下内容(为简洁而简化);

public partial class Driver : AuditableEntity<int>
{
    [Key,Column("driverId", Order=0)]
    [JsonProperty(PropertyName="driverid")]
    public override int ID { get; set; }

    [Key,Column("type", Order=1)]
    [ForeignKey("DriverType")]
    [JsonProperty(PropertyName="drivertypeid")]
    public int DriverTypeId { get; set; }
    public DriverType DriverType { get; set; }

如何将它添加到DriverToVehicle类中呢?到目前为止我已经

公共部分类DriversToVehicle     {         [专栏(&#34; id&#34;),Key]         public int ID {get;组; }

    [Column("driverid", Order=0), ForeignKey("Driver")]
    public int DriverID { get; set; }
    public Driver Driver { get; set; }

    [Column("type", Order = 1), ForeignKey("Driver")] 
    public int DriverTypeId { get; set; }

    [ForeignKey("DriverTypeId")]
    public DriverType DriverType { get; set; }

}

虽然这对我来说不合适?

1 个答案:

答案 0 :(得分:0)

由于您的Drivers表的主键现在为(DriverId, Type),因此您无法再仅通过DriverId引用您的驱动程序 - 您必须通过DriverId引用它们}和Type。因此,您的DriversToVehicle表需要看起来像这样:

public partial class DriversToVehicle
{
    [Column("id"), Key]
    public int ID { get; set; }

    [Column("driverid")]
    public int DriverID { get; set; }
    [ForeignKey("DriverID")]
    public Driver Driver { get; set; }

    [Column("DriverType")]
    public int DriverType { get; set; }
    [ForeignKey("type")]
    public int DriverType { get; set; }

    [Column("vehicleid")]
    public int VehicleID { get; set; }
    [ForeignKey("VehicleID")]
    public Vehicle Vehicle { get; set; }
}

但是,正如@hopeless所述,如果您正确地为DriverVehicle类型建模,则可能无需为此联接表建模。

HTH。