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; }
}
问题是 StepUp
和 Transformador
都与 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>
.
我遇到了一些外键问题,原来我是在对旧系统进行修改,在其中添加了一个新的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; }
}
问题是 StepUp
和 Transformador
都与 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>
.