从域模型映射

时间:2018-03-19 16:53:15

标签: c# entity-framework ef-fluent-api

我有一个域模型,其中属性具有自己的域类型(所有域类型都具有“Value”属性以返回其标量值)。 E.g。

Class FurryFrogMessage {
    public Name FurryFrogName {get; private set}
    public MaxWeight FurryFrogTopsOutAt {get; private set}
    ...
}

Class Name {
    public string Value;
    ...
}
...

现在我来坚持域模型中的对象我不确定哪种方法最好。

我正在使用Entity Framework,尝试使用带有EF Fluent API的域类来描述数据应该如何映射到数据库表。

但是,由于我的域类的每个属性都是复杂类型,因此实体框架留给自己的是将列名设置为复杂类型,后跟“_Value”(复杂类型的属性)。

e.g。 “FurryFrogName_Value”是列的名称,而我希望它是“FurryFrogName”

为了拥有合理的列名,我必须为Fluent API中每个类的每个属性指定列名。

modelBuilder.Entity<FurryFrogMessage >()
    .Property(m => m.FurryFrogName.Value)
        .HasColumnName("FurryFrogName");
modelBuilder.Entity<FurryFrogMessage >()
    .Property(m => m.FurryFrogTopsOutAt.Value)
        .HasColumnName("FurryFrogTopsOutAt");

是否有某种方法可以在Entity Framework中自定义映射,以指示对于我的域类中的每个属性(复杂类型),我希望它使用属性的名称和复杂类型的Value属性?< / p>

或者我是否过多地询问实体框架?

(或者我应该以另一种方式这样做?)

2 个答案:

答案 0 :(得分:1)

我会评论,但我缺乏声誉。

您可以尝试在实体类中使用ColumnAttribute:

AppServiceProvider

还有一些代码,但更少。

答案 1 :(得分:1)

我对实体框架不熟悉,但尝试了一下。经过一些修补后,我做了一个扩展方法,它将表达式作为参数,从主体中提取第一个属性名称并将其用作列名。

这是我的实施:

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

where T : class约束来自EntityTypeConfiguration

示例中的用法:

modelBuilder.Entity<FurryFrogMessage>()
    .ComplexProperty(m => m.FurryFrogName.Value)

另外,这里是基于microsofts EF教程的示例的链接:https://gist.github.com/anonymous/d59d5c71787b5604bf41e021fcc53791

在LocalDb上使用VS2017对我有用。 EF使用类型为int的BlogId和类型为nvarchar(max)的名称创建表博客。

我不确定您要使用包含值的自定义对象实现的目标,而不仅仅是使用string,但我希望我的答案有所帮助。