簡體   English   中英

遺留數據庫上的實體框架代碼第一個復合外鍵

[英]Entity Framework Code First Composite Foreign Key on legacy DB

因此,幾天來我一直在for頭,搜索使我無處可尋。

我有一個遺留數據庫,遠沒有遵循EF的代碼約定,而我使用的是EF Code First。

這是我的實際情況:(為簡潔起見,省略了Irlelevant字段)

[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”中角色“ Pedido_DadosMateriaisPedido_Source”中的引用約束沖突。 因為從屬角色中的所有屬性都是不可為空的,所以主體角色的多重性必須為'1'。 Pedido_DadosMateriaisPedido_Target:多重性在關系“ Pedido_DadosMateriaisPedido”中的角色“ Pedido_DadosMateriaisPedido_Target”中無效。 由於從屬角色指的是關鍵屬性,因此從屬角色的多重性上限必須為“ 1”。

我缺少什么?我們將不勝感激!

因此,我終於發現了所發生的事情,因此以下是我的解決方案,以供將來參考,並希望它能夠幫助像我這樣的其他絕望靈魂:

我的映射是完全錯誤的。 MATERIAL_PEDIDO與PEDIDO沒有關系(不確定我是否同意此設計,但是...),並且Entity Framework不批准創建數據庫中不存在的關系。 第三個表除了包含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; }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM