使用Entity Framework为复杂类型进行列映射

7

我有一个复杂的类型类..以下是层次结构

 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知道列被映射到这样的方式,以便它忽略默认映射并遵循自定义映射?

1个回答

7

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

参考文献:EF Code First中的关联关系:第二部分 - 复杂类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接