遗留数据库上的实体框架代码第一组合外键
本文关键字:组合 代码 框架 数据库 实体 | 更新日期: 2023-09-27 18:02:30
所以,我已经绞尽脑汁了几天了,但搜索并没有让我找到解决方案。
我有一个远没有遵循EF代码约定的遗留数据库,我正在使用EF代码优先。
这是我的实际情况:(为简洁起见,谢绝使用不相关的字段)
[Table("PEDIDO")]
public class Pedido : IValidatableObject
{
[Key, Column(Order = 1), Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CODIGO { get; set; }
[Key, Column(Order = 2), ForeignKey("DadosCliente"), Required]
public int CLIENTE { get; set; }
public virtual Cliente DadosCliente { get; set; }
public virtual ICollection<MaterialPedido> DadosMateriaisPedido { get; set; }
}
[Table("MATERIAL_PEDIDO")]
public class MaterialPedido : IValidatableObject
{
[Key, Required, Column(Order = 1)]
public int NRPEDIDO { get; set; } // This column relates to Pedido.CODIGO
[Key, Required, Column(Order = 2), ForeignKey("DadosCliente")]
public int CLIENTE { get; set; }
public virtual Cliente DadosCliente { get; set; }
[Key, Required, Column(Order = 3)]
public string CODIGO { get; set; }
// Please note that this column is some sort of "virtual field". Its value should be hard-coded to "P" when relating to the table "PEDIDO"
}
public class EntitiesContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Pedido>()
.HasKey(p => new { p.CLIENTE, p.CODIGO })
.HasMany(x => x.DadosMateriaisPedido)
.WithOptional(p => p.Pedido)
.HasForeignKey(x => new { x.CLIENTE, x.NRPEDIDO })
.WillCascadeOnDelete(false);
}
}
到目前为止,我得到以下错误:
ProjetoPI.EF。多重性与"Pedido_DadosMateriaisPedido"关系中角色"Pedido_DadosMateriaisPedido_Source"中的引用约束冲突。因为从属角色中的所有属性都不可为空,所以主角色的多重性必须为"1"。在关系"Pedido_DadosMateriaisPedido_Target"中的角色"Pedido_DadosMateriaisPedido_Target"中多重性无效。因为从属角色引用了关键属性,所以从属角色的多重性的上界必须是'1'。
我错过了什么?任何帮助将非常感激!
所以,我终于发现发生了什么,所以下面是我的解决方案,供将来参考,希望它能够帮助其他绝望的灵魂像我:
我的映射完全错了。MATERIAL_PEDIDO与PEDIDO没有关系(不确定我是否同意这种设计,但是……)和实体框架不批准创建数据库上不存在的关系。第三个表除了包含MaterialPedido的子表外,还包含了Pedido和MaterialPedido之间的关系。
[我不能发布图像,所以我将无法发布数据库模型=(]。所以我清除了所有的关系,从头开始重塑。
以下是我的工作关系:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Pedido>()
.HasKey(p => new { p.CLIENTE, p.CODIGO })
.HasMany<DetalhePedido>(p => p.DetalhesPedido)
.WithRequired(dp => dp.Pedido)
.HasForeignKey(dp => new { dp.CLIENTE, dp.NRPEDIDO });
modelBuilder.Entity<MaterialPedido>()
.HasKey(mp => new { mp.NRPEDIDO, mp.CLIENTE, mp.CODIGO })
.HasMany<DetalhePedido>(mp => mp.DetalhesPedido)
.WithRequired(dp => dp.MaterialPedido)
.HasForeignKey(dp => new { dp.NRPEDIDO, dp.CLIENTE, dp.MATERIAL });
}
[Table("MATERIAL_PEDIDO")]
public class MaterialPedido : IValidatableObject
{
[Key, Required, Column(Order = 1)]
public int NRPEDIDO { get; set; }
[Key, Required, Column(Order = 2), ForeignKey("DadosCliente")]
public int CLIENTE { get; set; }
public virtual Cliente DadosCliente { get; set; }
[Key, Column(Order = 3)]
public string CODIGO { get; set; }
public virtual ICollection<DetalhePedido> DetalhesPedido { get; set; }
}
[Table("DETALHE_PEDIDO")]
public class DetalhePedido
{
[Key, Column(Order = 1)]
public int NRPEDIDO { get; set; }
[Key, Column(Order = 2)]
public int CLIENTE { get; set; }
[Key, Column(Order = 3)]
public string MATERIAL { get; set; }
[Key, Column(Order = 4)]
public string CODIGO { get; set; }
public virtual Pedido Pedido { get; set; }
public virtual MaterialPedido MaterialPedido { get; set; }
}
[Table("PEDIDO")]
public class Pedido : IValidatableObject
{
[Key, Column(Order = 1), DisplayName("Cód Pedido"), Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CODIGO { get; set; }
[Key, Column(Order = 2), Required, CustomValidation(typeof(GranitoEntities), "NotZero")]
public int CLIENTE { get; set; }
[ForeignKey("CLIENTE")]
public virtual Cliente DadosCliente { get; set; }
public virtual ICollection<DetalhePedido> DetalhesPedido { get; set; }
}