所以,我现在已经敲了几天头,而且搜索让我无法接近解决方案。
我有一个遗留数据库,远非遵循EF的代码约定,而且我使用的是EF Code First。
这是我的实际情况:(为了简洁而省略了无关的字段)
[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 ::多重性与角色&#39; Pedido_DadosMateriaisPedido_Source&#39;中的参照约束冲突。在关系&#39; Pedido_DadosMateriaisPedido&#39;。由于从属角色中的所有属性都是不可为空的,因此主要角色的多重性必须为“1”。 Pedido_DadosMateriaisPedido_Target ::多重性在角色&#39; Pedido_DadosMateriaisPedido_Target&#39;在关系&#39; Pedido_DadosMateriaisPedido&#39;。由于“从属角色”是指关键属性,因此“从属角色”的多重性的上限必须为“&#39; 1”。
我缺少什么?非常感谢任何帮助!
答案 0 :(得分:0)
所以,我终于知道发生了什么,所以下面是我未来参考的解决方案,并希望它能够帮助像我这样的其他绝望的灵魂:
我的映射完全错误。 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; }
}