C# 实体框架6上的数据库迁移问题

C# 实体框架6上的数据库迁移问题,c#,entity-framework,C#,Entity Framework,我有以下课程(为简洁起见缩短) 公共类保险政策:可审计实体 { [列(“id”),键] 公共重写int-ID{get;set;} [列(“设备ID”)、外键(“设备”)] 公共int设备ID{get;set;} 公共虚拟设备{get;set;} } 公共部分类设备:AuditableEntity { [列(“设备ID”),键] 公共重写int-ID{get;set;} [外汇(“政策”)] public int PolicyId{get;set;} 公共虚拟保险策略{get;set;} [外国钥

我有以下课程(为简洁起见缩短)

公共类保险政策:可审计实体
{
[列(“id”),键]
公共重写int-ID{get;set;}
[列(“设备ID”)、外键(“设备”)]
公共int设备ID{get;set;}
公共虚拟设备{get;set;}
}
公共部分类设备:AuditableEntity
{
[列(“设备ID”),键]
公共重写int-ID{get;set;}
[外汇(“政策”)]
public int PolicyId{get;set;}
公共虚拟保险策略{get;set;}
[外国钥匙(“车辆”)]
public int VehicleId{get;set;}
公共虚拟车辆{get;set;}
}
公共部分类车辆:可审计实体
{
[列(“id”),键]
公共重写int-ID{get;set;}
[列(“设备ID”)、外键(“设备”)]
公共int设备ID{get;set;}
公共虚拟设备{get;set;}
公共虚拟列表保险保单车辆{get;set;}
}
现在,当我尝试运行我的
updatedatabase
命令时,我得到以下错误:

设备策略目标::多重性在关系“设备策略”中的角色“设备策略目标”中无效。因为依赖角色属性不是键属性,所以依赖角色的多重性上限必须为“*”

设备\车辆\目标::多重性在关系“设备\车辆”中的角色“设备\车辆\目标”中无效。因为依赖角色属性不是键属性,所以依赖角色的多重性上限必须为“*”


有人能告诉我这里做错了什么吗?

设备\u策略\u目标
关系为例,您有以下几点(精简到此关系的相关属性):

这部分是EF不支持唯一约束的结果。 使用DataAnnotation更全面地解释了一对一的关系

更新:

使用“表”/“键”一对一的“假”,然后考虑这样的事情:

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

}
公共类保险政策:可审计实体
{   
[列(“id”),键]
公共重写int-ID{get;set;}
[列(“设备ID”)、外键(“设备”)]
公共int设备ID{get;set;}
公共虚拟设备{get;set;}
}
公共部分类设备:AuditableEntity
{
[列(“设备ID”),键]
公共重写int-ID{get;set;}
公共虚拟IEnumerable策略列表{get;set;}
[未映射]
公共虚拟保险单{
得到{
返回(PoliciesAsList!=null)
?策略列表FirstOrDefault()
:null;
}
}
}
在这种情况下,我任意选择了
设备
作为父项-选择哪个并不重要


您还应确保数据库对InsurancePolicy表上的
deviceid
具有唯一的约束。

Hi Jon,谢谢您的回复。这里唯一的问题是数据库中存在表(即deviceid是设备中的PK,id是InsurancePolicy中的PK)。因此,我需要保留例如[Column(“id”),Key]public override int id{get;set;},因为PK在db中是有效的id,dba不允许更改它。在这种情况下有什么建议吗?嗨,乔恩,非常感谢你花时间看这个。我需要对表进行调整和更改,但有人告诉我必须保留现有的列名。因此,在这种情况下,设备可以独立于策略而生存,反之亦然。它们可以并且最终将被链接(即一旦分配等)。您必须在EF中将它们切换为一对多关系-至少对于配置而言。您始终可以添加一个附加属性来检索列表中的第一个项目(如果它存在),否则为null。为了添加此属性,我尝试实现的是在保险单中有一个deviceid列(可以为null),在设备表中有一个policyid列(也可以为null)。然后,当设备被分配到策略时,只需填写此项即可。为了便于在EF中使用,我希望能够从任何一方访问保单(即从dvice获取保单,反之亦然)。这是可能的吗?选择一个名义上是父类-你不需要两边的ID来建立链接。我感觉到类之间的交叉关系。”“保险单”类同时引用“设备”类,也引用了“设备”类。我认为这是不能接受的。请优化表关系
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; }

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

}