.NET Framework迁移时Entity Framework复合主键外键类型不匹配求助
问题根因
这个错误是复合外键与主表复合主键的字段顺序不匹配导致的:
你定义的MEG_OFERTAS实体复合主键当前标注顺序为:
I_NRO_OFERTA(decimal类型,Order=0)DT_DIA_OPERACION(DateTime类型,Order=1)
但EF匹配关联时,把MEG_OPERACIONES的DT_DIA_OPERACION(DateTime类型)和主表第一个主键I_NRO_OFERTA(decimal类型)做了匹配,类型不匹配触发报错,本质是自动生成Code First时,实体主键的标注顺序和数据库实际的主键顺序不一致导致的字段错位。
解决方案
步骤1:确认数据库主键顺序
先打开SQL Server查看MEG_OFERTAS表的主键字段实际顺序,绝大多数这类自动生成的场景,数据库实际主键顺序和实体标注的相反,即第一列为DT_DIA_OPERACION,第二列为I_NRO_OFERTA。
步骤2:调整实体主键顺序
修改MEG_OFERTAS实体的主键Order标注,和数据库实际顺序对齐:
public partial class MEG_OFERTAS : IEntity { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public MEG_OFERTAS() { MEG_OPERACIONES = new HashSet<MEG_OPERACIONES>(); MEG_OPERACIONES1 = new HashSet<MEG_OPERACIONES>(); } // 调整为Order=0,对应数据库主键第一列 [Key] [Column(Order = 0, TypeName = "datetime2")] public DateTime DT_DIA_OPERACION { get; set; } // 调整为Order=1,对应数据库主键第二列 [Key] [Column(Order = 1, TypeName = "numeric")] public decimal I_NRO_OFERTA { get; set; } // 其余属性、导航属性保持不变 }
步骤3:调整Fluent API外键顺序
修改DbContext中的关联配置,外键顺序必须和主表主键顺序严格对齐:
modelBuilder.Entity<MEG_OFERTAS>() .HasMany(e => e.MEG_OPERACIONES) .WithRequired(e => e.MEG_OFERTAS) // 外键顺序和主表主键顺序一致:先DT_DIA_OPERACION,再I_NRO_OFERTA_COMPRA .HasForeignKey(e => new { e.DT_DIA_OPERACION, e.I_NRO_OFERTA_COMPRA }) .WillCascadeOnDelete(false); modelBuilder.Entity<MEG_OFERTAS>() .HasMany(e => e.MEG_OPERACIONES1) .WithRequired(e => e.MEG_OFERTAS1) // 第二个关联同理调整顺序 .HasForeignKey(e => new { e.DT_DIA_OPERACION, e.I_NRO_OFERTA_VENTA }) .WillCascadeOnDelete(false);
修改完成后重新运行代码即可解决类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Gabriel Greco
相关产品推荐
相关产品推荐

