Entity framework 复杂类型的列映射

Entity framework column mapping for complex types

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

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

当我将项目保存到数据库中时,SQL 探查器显示它需要列名 作为 Cost_SparePartsCost,其中我的数据库的列名称为 SparePartsCost。 我故意以这种方式创建数据库列名称,因为我不想在名称之间插入“_”。

如何让 Entity Framework 知道列的映射方式使其忽略其默认映射并遵循自定义映射?

您可以通过多种方式覆盖默认的 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