Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 域模型映射_C#_Entity Framework_Ef Fluent Api - Fatal编程技术网

C# 域模型映射

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” 为了获得合理

我有一个域模型,其中属性有自己的域类型(都有“Value”属性返回标量值)。例如

现在,我要将对象持久化到域模型中,我不确定哪种方法是最好的

我正在使用实体框架,试图使用带有EF Fluent API的域类来描述数据应该如何映射到数据库表

然而,由于我的域类的每个属性都是复杂类型,Entity Framework将列名设置为复杂类型,后跟“\u Value”(复杂类型的属性)

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

为了获得合理的列名,我必须为fluentapi中每个类的每个属性指定列名

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)