C# 在Entity Framework 6中使用复合键和多个列属性
我试图创建一个使用两个字段的复合键,当我首先使用代码创建数据库表中的现有字段时C# 在Entity Framework 6中使用复合键和多个列属性,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我试图创建一个使用两个字段的复合键,当我首先使用代码创建数据库表中的现有字段时 [Key,Column("driverId", Order=0)] [JsonProperty(PropertyName="driverid")] public override int ID { get; set; } [Key,Column("type", Order=1)] [JsonProperty(PropertyName="typeid")] public
[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\u Driver\u Target\u DriversToVehicle\u Driver\u 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; }
现在向前看,这将如何影响链接到它的其他实体(我指的是类中的代码优先)?ef会自动解决这个问题吗?或者,当链接到此类时,我现在是否需要在其他实体中同时使用这两个键
e、 和以前一样,我也会这样做
public virtual Driver myDriver;
显然,现在不需要单独在ID上链接,它还需要与类型链接
提前谢谢
编辑答案
好的,我将类型提取到一个单独的类中。现在的主要问题是如何将外键标记为复合键
我有以下课程
public partial class DriverType
{
[Column("Id")]
[JsonProperty(PropertyName = "drivertypeid")]
public override int ID { get; set; }
[JsonProperty(PropertyName = "drivertype")]
public string Name { get; set; }
}
然后在驱动程序中,我有以下内容(为了简洁起见,减少了)
但是,我觉得这不太合适?因为您的
驱动程序表的主键现在是(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; }
}
但是,正如上面@appect所述,如果正确地为驾驶员
和车辆
类型建模,则可能不需要对该联接表建模
HTH.我不明白您的第一个问题,您发布的代码有什么问题?看起来您正在尝试为连接(或连接)表配置一个类?这通常是隐藏的。您应该配置的是表示驱动程序
和类型
的实体类;我已经看了一段时间了,我更新了一个问题,这个问题现在更有意义了吗?@你在上面看到的是驱动程序类。我现在需要将其更改为复合密钥。如果driverrid和type(int)是联合键,我不太熟悉基于代码的配置,但是您应该发布相关类(我猜它是DriversToVehicle
,…),以及您尝试在它们之间映射所做的工作(以便其他人可以提供帮助)。一旦您将旧密钥更改为复合密钥,所有涉及的关系都应考虑再次更新。嗨,Rich,好的,这很好我了解您在这里做什么,我不需要在这里使用外键链接它们吗?你的答案也有错别字(不是挑剔,我只是想把它弄对,哈哈)。i、 e.EF如何知道哪两个字段映射到车辆类别?
[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; }
}
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; }
}