我有一个域模型,其中属性具有自己的域类型(所有域类型都具有“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>
或者我是否过多地询问实体框架?
(或者我应该以另一种方式这样做?)
答案 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
,但我希望我的答案有所帮助。