复杂类型的实体框架列映射

时间:2017-09-12 19:00:42

标签: entity-framework complextype

我有复杂的类型..这是层次结构

 public class Item 
 {
    public virtual Summary Summary { get; set; }
 }

 public class Summary
 {
    public int Id { get; set; }

    [Key, ForeignKey("Item")]
    public int ItemId { get; set; }

    public virtual Item Item { get; set; }

    public virtual ClaimSummary Cost { get; set; }
 }

    [ComplexType]
    public class ClaimSummary
    {
        public virtual decimal? SparePartsCost { get; set; }

        public virtual decimal? LaborHours { get; set; }
                  .....
    }

当我将Item保存到DB时,SQL分析器显示它需要列名 作为Cost_SparePartsCost我的数据库的列名为SparePartsCost。 我有目的地创建了DB列名称,因为我不想要' _'在名字之间。

我如何让实体框架知道列的映射方式是忽略其默认映射并遵循自定义映射?

1 个答案:

答案 0 :(得分:4)

您可以通过多种方式覆盖默认的EF复杂类型列名称约定。

如果要避免使用复杂类型的所有实体中的前缀,可以使用数据注释(Column属性):

[ComplexType]
public class ClaimSummary
{
    [Column("SparePartsCost")]
    public virtual decimal? SparePartsCost { get; set; }

    [Column("LaborHours")]
    public virtual decimal? LaborHours { get; set; }

    // ...
}

或流利的配置:

modelBuilder.ComplexType<ClaimSummary>()
    .Property(e => e.SparePartsCost).HasColumnName("SparePartsCost");
modelBuilder.ComplexType<ClaimSummary>()
    .Property(e => e.LaborHours).HasColumnName("LaborHours");

如果您只想为某个实体(例如Summary)覆盖默认约定,那么您可以在实体级别使用流畅配置,如下所示:

modelBuilder.Entity<Summary>()
    .Property(e => e.Cost.SparePartsCost).HasColumnName("SparePartsCost");
modelBuilder.Entity<Summary>()
    .Property(e => e.Cost.LaborHours).HasColumnName("LaborHours");

参考:Associations in EF Code First: Part 2 – Complex Types