Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Entity Framework 6中使用复合键和多个列属性_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

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