I am having some foreign key problems, it turns out that I am doing a revision to an old system in which a new table is added, and in doing so, the following arises.
In short, I have the following 3 classes.
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; } }
The issue is that both StepUp
and Transformador
have a 1- * relationship with Accessorio_x_Trafos
.
When migrating, the database is created correctly (FKs are added)
(Ignore the FK Accesorios
which is one of the properties that I removed so as not to have so much code)
The issue is that when I try, both modify an object of type Transformer (I do it as follows)
//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();
But this throws the follow exception
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…
And in the InnerException the
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”.rnSe terminó la instrucción.
How can i deal with this?
Advertisement
Answer
I solve my issue by creating an abstract class that replaced Accessory_x_Trafos
in such a way, that you then specify each inherited class with its foreign key and corresponding navigation property.
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; } }
In this way, in each of the corresponding classes, I used properties, either type ICollection<AccesorioStepUp>
or type ICollection<AccesorioDistribucion>
.