我遇到了一些外键问题,事实证明我正在对添加新表的旧系统进行修订,这样做时会出现以下问题。
总结一下,我有以下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; }
//Muchas otras propiedades..
}
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; }
//Muchas otras propiedades..
}
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
1-* 关系Accesorio_x_Trafos
。
迁移时,数据库创建成功(添加了FK)
(忽略 FK 附件,这是我删除的属性之一,没有那么多代码)
问题是当我尝试同时修改类型的对象时Transformador
(我这样做如下)
//Obtengo un trafo cualquiera
var transformador = mContext.Transformador.First();
//Cargo datos de ejemplo:
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"}
};
//Guardo
mContext.SaveChanges();
这会触发以下异常:
保存不为其关系公开外键属性的实体时发生错误。EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。处理异常时...
看到 InnerException,它引用了一个 FK 问题
INSERT 语句与 FOREIGN KEY 约束 \"FK_dbo.Accesorio_x_Trafos_dbo.StepUps_CodigoDelfos_Revision\" 冲突。冲突已出现在数据库 \"DBTrafos\"、表 \"dbo.StepUps\" 中。\r\n语句已终止。
我该如何解决我的问题?
或者,如果是这种情况,我怎样才能更详细地了解与外键的冲突具体是什么?
谢谢!!
我认为您的错误在于将类映射到数据库。充当外键的属性必须使用 Entity Framework 标签指定,
[ForeignKey(name)]
如下所示:我真的不知道它是否可能是来自不同表的两个不同属性的外键。虽然它可以通过对 Transformer 和 StepUp 表进行概括来解决。或者由于两者具有相同类型的相同字段,因此只保留一个表添加一个指定类型的字段(Transformer 或 StepUp)。我给你留下一个链接,你可以在其中看到ForeignKey标签的使用
再次查看您的案例,我发现您提到的错误在以下部分的 Microsoft Link页面中提到:添加迁移。
我希望这可以帮助你。
概括这些表并添加一个类型来区分它们,它看起来像这样:
我给您留下另一个链接,其中包含实体关系模型链接中泛化的解释和简单示例
我最终在 Alexmaister 的评论的帮助下修复了它。
我通过创建一个抽象类来实现这一点,该类
Accesorio_x_Trafos
以这样一种方式覆盖,然后我使用其对应的外键和导航属性指定每个继承的类。这样,在每个对应的类中,我都使用了属性,
ICollection<AccesorioStepUp>
例如ICollection<AccesorioDistribucion>
.