[英]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.