遗留数据库上的实体框架代码第一组合外键

本文关键字:组合 代码 框架 数据库 实体 | 更新日期: 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; }
}