按属性名称的复杂类型约定?

时间:2019-06-18 15:59:34

标签: entity-framework entity-framework-6

复杂类型

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();
    }
}
  • Created.By => CreatedBy
  • Created.On => CreatedOn
  • Started.By => StartedBy
  • Started.On => StartedOn
  • Finished.By => FinishedBy
  • 等等。

我知道我可以为每种类型创建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 []。'

1 个答案:

答案 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>,只需为时间戳属性的每种组合实现。大部分都只有CreatedModified,因此大大减少了编码,但仍然不如使用声明的属性作为命名方案好。