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");
我有复杂类型 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");