繁体   English   中英

Entity Framework 6 上的数据库迁移问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM