复杂类型
public class Timestamp
{
public string By { get; set; }
public DateTime? On { get; set; }
}
所需的默认映射
是否有一种向实体框架添加约定的方法,以便以我的Timestamp
类作为属性的类型(如下所示)默认映射到“ CreatedBy”而不是“ Created_By”?如果可以,怎么办?
public class StationProductRun
{
public int Id { get; set; }
public int PlantProductRunId { get; set; }
public int StationId { get; set; }
public string SapProductId { get; set; }
public Timestamp Created { get; set; }
public Timestamp Started { get; set; }
public Timestamp Finished { get; set; }
public StationProductRun()
{
Created = new Timestamp();
Started = new Timestamp();
Finished = new Timestamp();
}
}
我知道我可以为每种类型创建EntityTypeConfiguration<T>
实现,但是我厌倦了编写这样的可扩展代码并寻求更好的选择。
我尝试过的事情
我尝试了以下方法,但是我不确定是否在此方面,而且它抱怨过滤出属性等。甚至不确定这是否满足我的要求。
modelBuilder.Properties<Timestamp>()
.Configure(x =>
{
if (x.ClrPropertyInfo.DeclaringType == typeof(Timestamp))
{
switch (x.ClrPropertyInfo.Name)
{
case "By":
x.HasColumnName(x.ClrPropertyInfo.Name + "By")
.IsOptional();
return;
case "On":
x.HasColumnName(x.ClrPropertyInfo.Name + "On")
.IsOptional();
return;
}
}
});
'类型'时间戳'不能用于过滤属性。仅支持标量类型,字符串和byte []。'
答案 0 :(得分:0)
这是我将要使用的,直到得到答案。这不是我理想的解决方案,但是比我目前拥有的解决方案好。
实体接口
public interface ICreated
{
Timestamp Created { get; set; }
}
public interface IModified
{
Timestamp Modified { get; set; }
}
实体类型配置
public class EntityConfigCreated<T> : EntityTypeConfiguration<T> where T : class, ICreated
{
public EntityConfigCreated()
{
this.Property(x => x.Created.By)
.HasColumnName("CreatedBy")
.HasMaxLength(256)
.IsOptional();
this.Property(x => x.Created.On)
.HasColumnName("CreatedOn")
.IsOptional();
}
}
public class EntityConfigModified<T> : EntityTypeConfiguration<T> where T : class, IModified
{
public EntityConfigModified()
{
this.Property(x => x.Modified.By)
.HasColumnName("ModifiedBy")
.HasMaxLength(256)
.IsOptional();
this.Property(x => x.Modified.On)
.HasColumnName("ModifiedOn")
.IsOptional();
}
}
public class EntityConfigCreatedModified<T> : EntityTypeConfiguration<T> where T : class, ICreated, IModified
{
public EntityConfigCreatedModified()
{
this.Property(x => x.Created.By)
.HasColumnName("CreatedBy")
.HasMaxLength(256)
.IsOptional();
this.Property(x => x.Created.On)
.HasColumnName("CreatedOn")
.IsOptional();
this.Property(x => x.Modified.By)
.HasColumnName("ModifiedBy")
.HasMaxLength(256)
.IsOptional();
this.Property(x => x.Modified.On)
.HasColumnName("ModifiedOn")
.IsOptional();
}
}
这样,我不必为每种类型实现EntityTypeConfiguration<T>
,只需为时间戳属性的每种组合实现。大部分都只有Created
和Modified
,因此大大减少了编码,但仍然不如使用声明的属性作为命名方案好。