C# 实体框架代码旧数据库上的第一个复合外键

C# 实体框架代码旧数据库上的第一个复合外键,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,所以,我已经绞尽脑汁好几天了,搜索结果让我无法找到解决办法 我有一个传统数据库,它远远没有遵循EF的代码约定,我首先使用EF代码 这是我的实际情况:(为了简洁起见,不相关的字段被省略) [表格(“PEDIDO”)] 公共类Pedido:IValidatableObject { [键,列(顺序=1),必填] [数据库生成(DatabaseGeneratedOption.Identity)] public int CODIGO{get;set;} [键,列(顺序=2),外键(“数据客户端”),必填]

所以,我已经绞尽脑汁好几天了,搜索结果让我无法找到解决办法

我有一个传统数据库,它远远没有遵循EF的代码约定,我首先使用EF代码

这是我的实际情况:(为了简洁起见,不相关的字段被省略)

[表格(“PEDIDO”)]
公共类Pedido:IValidatableObject
{
[键,列(顺序=1),必填]
[数据库生成(DatabaseGeneratedOption.Identity)]
public int CODIGO{get;set;}
[键,列(顺序=2),外键(“数据客户端”),必填]
公共int客户端{get;set;}
公共虚拟客户端数据客户端{get;set;}
公共虚拟ICollection DadosMaterialisPedido{get;set;}
}
[表(“材料”)
公共类MaterialMedido:IValidatableObject
{
[键,必填,列(顺序=1)]
public int NRPEDIDO{get;set;}//此列与Pedido.CODIGO相关
[键,必填,列(订单=2),外键(“数据客户”)]
公共int客户端{get;set;}
公共虚拟客户端数据客户端{get;set;}
[键,必填,列(顺序=3)]
公共字符串CODIGO{get;set;}
//请注意,此列是某种“虚拟字段”。当与表“PEDIDO”相关时,其值应硬编码为“P”
}
公共类EntitiesContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.HasKey(p=>new{p.CLIENTE,p.CODIGO})
.HasMany(x=>x.dadosMaterialisPedido)
.with可选(p=>p.Pedido)
.HasForeignKey(x=>new{x.CLIENTE,x.NRPEDIDO})
.WillCascadeOnDelete(假);
}
}
到目前为止,我得到以下错误:

ProjetoPI.EF.Pedido_dadosMaterialispedido::多重性与关系“Pedido_dadosMaterialispedido”中角色“Pedido_dadosMaterialispedido_Source”中的引用约束冲突。因为从属角色中的所有属性都不可为null,所以主体角色的多重性必须为“1”。 Pedido_数据材料Pedido_目标::多重性在关系“Pedido_数据材料Pedido_目标”中的角色“Pedido_数据材料Pedido_目标”中无效。因为依赖角色引用密钥属性,所以依赖角色的多重性上限必须为“1”


我错过了什么?任何帮助都将不胜感激

所以,我终于发现了发生了什么,下面是我的解决方案,以供将来参考,并希望它能够帮助其他像我这样绝望的灵魂:

我的地图完全错了。MATERIAL_PEDIDO与PEDIDO没有关系(我不确定是否同意此设计,但…),实体框架不批准创建数据库中不存在的关系。第三个表除了包含MaterialMedido的子表外,还包含了Pedido和MaterialMedido之间的关系

[我无法发布图像,因此我无法发布DB模型=(])。因此我清除了所有关系,并从头开始重新构建

以下是我的工作关系:

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; }

}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.HasKey(p=>new{p.CLIENTE,p.CODIGO})
.HasMany(p=>p.DetalhesPedido)
.WithRequired(dp=>dp.Pedido)
.HasForeignKey(dp=>new{dp.CLIENTE,dp.NRPEDIDO});
modelBuilder.Entity()
.HasKey(mp=>new{mp.NRPEDIDO,mp.CLIENTE,mp.CODIGO})
.HasMany(mp=>mp.DetalhesPedido)
.WithRequired(dp=>dp.MaterialMedido)
.HasForeignKey(dp=>new{dp.nrpedo,dp.CLIENTE,dp.MATERIAL});
}
[表(“材料”)
公共类MaterialMedido:IValidatableObject
{
[键,必填,列(顺序=1)]
公共整数NRPEDIDO{get;set;}
[键,必填,列(订单=2),外键(“数据客户”)]
公共int客户端{get;set;}
公共虚拟客户端数据客户端{get;set;}
[键,列(顺序=3)]
公共字符串CODIGO{get;set;}
公共虚拟ICollection DetalhesPedido{get;set;}
}
[表(“DETALHE_PEDIDO”)]
公共类DetalhePedido
{
[键,列(顺序=1)]
公共整数NRPEDIDO{get;set;}
[键,列(顺序=2)]
公共int客户端{get;set;}
[键,列(顺序=3)]
公共字符串材质{get;set;}
[键,列(顺序=4)]
公共字符串CODIGO{get;set;}
公共虚拟Pedido Pedido{get;set;}
公共虚拟材质edido MaterialPedido{get;set;}
}
[表(“PEDIDO”)]
公共类Pedido:IValidatableObject
{
[键,列(顺序=1),显示名称(“Cód Pedido”),必填]
[数据库生成(DatabaseGeneratedOption.Identity)]
public int CODIGO{get;set;}
[键,列(顺序=2),必填,自定义验证(类型(GranitoEntities),“非零”)]
公共int客户端{get;set;}
[外国客户]]
公共虚拟客户端数据客户端{get;set;}
公共虚拟ICollection DetalhesPedido{get;set;}
}
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; }

}