Entity Framework 一对多中的外键问题

Problem with foreign key in Entity Framework one to many

我遇到了一些外键问题,原来我是在对旧系统进行修改,在其中添加了一个新的table,在这样做的过程中,出现了以下情况。

简而言之,我有以下3个类。

public class StepUp
{
    [Key]
    [Column(Order = 0)]    
    public string CodigoDelfos { get; set; }    
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Revision { get; set; }
    public virtual ICollection<Accesorio_x_Trafos> Accesorios { get; set; }
    //More irrelevant properties..
}

public class Transformador 
{
    [Key]
    [Column(Order = 0)]
    public string Codigo_delfos { get; set; }
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Revision { get; set; }
    public virtual ICollection<Accesorio_x_Trafos> Accesorio_x_Trafos { get; set; }
    //More irrelevant properties..
}

public class Accesorio_x_Trafos
{
    [Key]
    [Column(Order = 0)]
    public string CodigoAccesorio { get; set; }        
    [Key]
    [Column(Order = 1)]
    public string CodigoDelfos { get; set; }
    [Key]
    [Column(Order = 2)]
    public int Revision { get; set; }       
    public int? Cantidad { get; set; }    
}

问题是 StepUpTransformador 都与 Accessorio_x_Trafos 有 1- * 关系。

迁移时,正确创建了数据库(添加了 FK)

(忽略 FK Accesorios,这是我删除的属性之一,以免有太多代码)

问题是,当我尝试时,两者都修改了一个 Transformer 类型的对象(我按如下方式进行)

//Get any object..
var transformador = mContext.Transformador.First();
//Add random data..
transformador.Accesorio_x_Trafos = new List<Accesorio_x_Trafos>
{
    new Accesorio_x_Trafos 
        { CodigoDelfos = transformador.Codigo_delfos, Revision = transformador.Revision, Cantidad = 1, CodigoAccesorio = "05-CBPA0150000802000P0800"},
    new Accesorio_x_Trafos
        { CodigoDelfos = transformador.Codigo_delfos, Revision = transformador.Revision, Cantidad = 2, CodigoAccesorio = "05-CBPA0150000803150P0700"},
    new Accesorio_x_Trafos
        { CodigoDelfos = transformador.Codigo_delfos, Revision = transformador.Revision, Cantidad = 3, CodigoAccesorio = "05-CBPA0150000803150P0700"}
};
//Save it
mContext.SaveChanges();

但这会抛出以下异常

An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while...

并且在 InnerException 中

Instrucción INSERT en conflicto con la restricción FOREIGN KEY \"FK_dbo.Accesorio_x_Trafos_dbo.StepUps_CodigoDelfos_Revision\". El conflicto ha aparecido en la base de datos \"DBTrafos\", tabla \"dbo.StepUps\".\r\nSe terminó la instrucción.

我该如何处理?

我通过创建一个抽象 class 来解决我的问题,它以这种方式替换了 Accessory_x_Trafos,然后您指定每个继承的 class 及其外键和相应的导航 属性.

public abstract class AccesorioTransformador
{
    public Guid Id { get; set; }
    public string CodigoAccesorio { get; set; }
    public int Cantidad { get; set; }   
}

public class AccesorioStepUp : AccesorioTransformador
{
    public string CodigoDelfos { get; set; }
    public int Revision { get; set; }   
    [ForeignKey(nameof(CodigoDelfos)+","+nameof(Revision))]   
    public StepUp.StepUp Transformador { get; set; }
}

public class AccesorioDistribucion : AccesorioTransformador
{
    public string CodigoDelfos { get; set; }
    public int Revision { get; set; }           
    [ForeignKey(nameof(CodigoDelfos) + "," + nameof(Revision))]
    public Transformador Transformador { get; set; }
}

这样,在每个对应的classes中,我都使用了属性,要么是type ICollection<AccesorioStepUp>,要么是type ICollection<AccesorioDistribucion>.