C# 域模型映射
我有一个域模型,其中属性有自己的域类型(都有“Value”属性返回标量值)。例如 现在,我要将对象持久化到域模型中,我不确定哪种方法是最好的 我正在使用实体框架,试图使用带有EF Fluent API的域类来描述数据应该如何映射到数据库表 然而,由于我的域类的每个属性都是复杂类型,Entity Framework将列名设置为复杂类型,后跟“\u Value”(复杂类型的属性) e、 g.“FurryFrogName_Value”是列的名称,而我希望它是“FurryFrogName” 为了获得合理的列名,我必须为fluentapi中每个类的每个属性指定列名C# 域模型映射,c#,entity-framework,ef-fluent-api,C#,Entity Framework,Ef Fluent Api,我有一个域模型,其中属性有自己的域类型(都有“Value”属性返回标量值)。例如 现在,我要将对象持久化到域模型中,我不确定哪种方法是最好的 我正在使用实体框架,试图使用带有EF Fluent API的域类来描述数据应该如何映射到数据库表 然而,由于我的域类的每个属性都是复杂类型,Entity Framework将列名设置为复杂类型,后跟“\u Value”(复杂类型的属性) e、 g.“FurryFrogName_Value”是列的名称,而我希望它是“FurryFrogName” 为了获得合理
modelBuilder.Entity<FurryFrogMessage >()
.Property(m => m.FurryFrogName.Value)
.HasColumnName("FurryFrogName");
modelBuilder.Entity<FurryFrogMessage >()
.Property(m => m.FurryFrogTopsOutAt.Value)
.HasColumnName("FurryFrogTopsOutAt");
modelBuilder.Entity()
.Property(m=>m.FurryFrogName.Value)
.HasColumnName(“FurryFrogName”);
modelBuilder.Entity()
.Property(m=>m.FurryFrogTopsOutAt.Value)
.HasColumnName(“FurryFrogTopsOutAt”);
是否有某种方法可以自定义实体框架中的映射,以指示对于域类中的每个属性(复杂类型),我希望它使用复杂类型的属性名和Value属性
还是我对实体框架要求过高
(或者我应该换一种方式来做吗?我会评论,但我缺乏声誉 您可以尝试在实体类中使用ColumnAttribute,如下所示:
[Column("CustomName")]
public MyType Name { get; set; }
仍然有一些代码,但较少。我不熟悉实体框架,但尝试了一下。经过一些修改,我创建了一个扩展方法,该方法将表达式作为参数,从主体中提取第一个属性名,并将其用作列名 以下是我的实现:
public static class EntityTypeConfigurationExtensions
{
public static void ComplexProperty<T>(
this EntityTypeConfiguration<T> configuration,
Expression<Func<T, string>> expression)
where T : class
{
var columnName = expression.Body.ToString().Split('.')[1];
configuration.Property(expression).HasColumnName(columnName);
}
}
此外,这里还有我的基于microsofts EF教程的示例链接:
它适用于我在LocalDb上使用VS2017。EF创建表blog,其中BlogId列的类型为int,Name列的类型为nvarchar(max)
我不确定您使用包含值的自定义对象而不是仅使用
字符串来实现什么,但我希望我的回答能有所帮助。据我所知,EF在如何映射几乎所有内容(包括列到名称)方面使用约定,但您正是在使用复杂类型,而您不希望在其他表上使用这些类型,从你正在做的事情来看,我目前还不知道其他的方法。您可以做的一个小的变通方法可能是一个通用函数,它将获取您的
并获取它的.Value
并将其设置为名称,因此您仍然可以完全按照您正在做的事情来做,只是要简单得多。实体框架基于关系、键和外键。您已经描述了从FurryFrogMessage到Name的关系,因此EF正在创建FK FurryFrogName_值。如果要控制命名,请公开FK。
public static class EntityTypeConfigurationExtensions
{
public static void ComplexProperty<T>(
this EntityTypeConfiguration<T> configuration,
Expression<Func<T, string>> expression)
where T : class
{
var columnName = expression.Body.ToString().Split('.')[1];
configuration.Property(expression).HasColumnName(columnName);
}
}
modelBuilder.Entity<FurryFrogMessage>()
.ComplexProperty(m => m.FurryFrogName.Value)