2017-09-12 33 views
1
实体框架列映射

我已经复杂类型类..Here是层次复杂类型

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在我的DB有列名作为SparePartsCost。 我特意创建了这样一个数据库列名,因为我不想在名称之间使用'_'。

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

回答

3

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

+0

没错它的工作谢谢 – user1532976