[英]Issue with Database Migrations on Entity Framework 6
我有以下课程(为简洁起见缩短);
public class InsurancePolicy : AuditableEntity<int>
{
[Column("id"), Key]
public override int ID { get; set; }
[Column("deviceid"), ForeignKey("Device")]
public int DeviceId { get; set; }
public virtual Device Device { get; set; }
}
public partial class Device : AuditableEntity<int>
{
[Column("deviceid"), Key]
public override int ID { get; set; }
[ForeignKey("Policy")]
public int PolicyId { get; set; }
public virtual InsurancePolicy Policy { get; set; }
[ForeignKey("Vehicle")]
public int VehicleId { get; set; }
public virtual Vehicle Vehicle { get; set; }
}
public partial class Vehicle : AuditableEntity<int>
{
[Column("id"), Key]
public override int ID { get; set; }
[Column("deviceid"), ForeignKey("Device")]
public int DeviceId { get; set; }
public virtual Device Device { get; set; }
public virtual List<InsurancePolicyVehicle> InsurancePolicyVehicles { get; set; }
}
现在,当我尝试运行我的update-database
命令时,出现此错误:
Device_Policy_Target::多重性在关系“Device_Policy”中的角色“Device_Policy_Target”中无效。 由于从属角色属性不是关键属性,因此从属角色的重数上限必须为“*”。
Device_Vehicle_Target::多重性在关系“Device_Vehicle”中的角色“Device_Vehicle_Target”中无效。 由于从属角色属性不是关键属性,因此从属角色的重数上限必须为“*”。
任何人都可以请告知我在这里做错了什么?
以Device_Policy_Target
关系为例,您有以下内容(修剪到此关系的相关属性):
public class InsurancePolicy : AuditableEntity<int>
{
[Column("id"), Key]
public override int ID { get; set; }
[Column("deviceid"), ForeignKey("Device")]
public int DeviceId { get; set; }
public virtual Device Device { get; set; }
}
public partial class Device : AuditableEntity<int>
{
[Column("deviceid"), Key]
public override int ID { get; set; }
[ForeignKey("Policy")]
public int PolicyId { get; set; }
public virtual InsurancePolicy Policy { get; set; }
}
你在这里定义的是一对一的关系。 EF 仅支持两个表共享主键的这种关系。 在您的配置中,您的子表 - InsurancePolicy
有自己的 PK 和一个 Foreign Key to Device
。 EF 仅支持具有这些约束的一对多关系。
要将这些关系定义为一对一,请将您的设置切换为以下内容:
public class InsurancePolicy : AuditableEntity<int>
{
[Column("deviceid"), Key, ForeignKey("Device")]
public override int ID { get; set; }
public virtual Device Device { get; set; }
}
public partial class Device : AuditableEntity<int>
{
[Column("deviceid"), Key]
public override int ID { get; set; }
public virtual InsurancePolicy Policy { get; set; }
}
这部分是 EF 不支持唯一约束的结果。 这篇文章更全面地解释了使用 DataAnnotations 的一对一关系
更新:
要使用您获得的表/键“伪造”一对一,请考虑以下内容:
public class InsurancePolicy : AuditableEntity<int>
{
[Column("id"), Key]
public override int ID { get; set; }
[Column("deviceid"), ForeignKey("Device")]
public int DeviceId { get; set; }
public virtual Device Device { get; set; }
}
public partial class Device : AuditableEntity<int>
{
[Column("deviceid"), Key]
public override int ID { get; set; }
public virtual IEnumerable<InsurancePolicy> PoliciesAsList { get; set; }
[NotMapped]
public virtual InsurancePolicy Policy {
get {
return (PoliciesAsList != null)
? PoliciesAsList.FirstOrDefault()
: null;
}
}
}
在这种情况下,我任意选择Device
作为父级 - 您选择哪个并不重要。
您还应该确保数据库对 InsurancePolicy 表上的deviceid
具有唯一约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.