使用 EntityTypeConfiguration 时的抽象领域模型基类<T>

问题描述 投票:0回答:4

获取 Base 对象属性的集中映射有什么技巧吗? 使用 EntityTypeConfiguration 时是否有抽象类的一些简单模式。
非常感谢任何提示。 我无法申报课程

Public class BaseEntityConfig<T> : EntityTypeConfiguration<T>

类似的问题,我无法得到工作的答案 如何创建和使用通用类 EntityTypeConfiguration生成 EntityTypeConfiguration 的动态方式:“TResult”类型必须是不可空值类型

public  abstract class BosBaseObject
{
  public virtual Guid Id { set; get; }
  public virtual string ExternalKey { set; get; }
  public byte[] RowVersion { get; set; }
}
  public class News : BosBaseObject
{
    public String Heading { set; get; }
}


public class NewsMap : EntityTypeConfiguration<News>
{
    public NewsMap()
    {
      //Base Object Common Mappings
      // How can we use a central mapping for all Base Abstract properties  


     }
 }
// Something like this but very open to any suggestion....
public class BosBaseEntityConfig<T> : EntityTypeConfiguration<T>
{
  public void BaseObjectMap( )
    { 
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        this.Property(t => t.Id).HasDatabaseGeneratedOption(databaseGeneratedOption: DatabaseGeneratedOption.None);

        this.Property(t => t.RowVersion)
            .IsRequired()
            .IsFixedLength()
            .HasMaxLength(8)
            .IsRowVersion();

        //Column Mappings
        this.Property(t => t.Id).HasColumnName("Id");
    }
}
c# ef-code-first
4个回答
9
投票

上面的答案肯定有效,尽管这可能稍微干净一些,并且在 DbContext 中注册配置时具有相同的工作原理。

public abstract class BaseEntity
{
    public int Id { get; set; }
}

public class Company : BaseEntity
{
    public string Name { get; set; }
}

internal class BaseEntityMap<T> : EntityTypeConfiguration<T> where T : BaseEntity
{
    public BaseEntityMap()
    {
        // Primary Key
        HasKey(t => t.Id);
    }
}

internal class CompanyMap : BaseEntityMap<Company>
{
    public CompanyMap()
    {
        // Properties
        Property(t => t.Name)
            .IsRequired()
            .HasMaxLength(256);
    }
}

public class AcmeContext : DbContext
{
    public DbSet<Company> Companies { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new CompanyMap());
    }
}

一天清晨,我和 Christian Williams 得出了上述解决方案......


3
投票

6 小时后,我破解了它。我认为这是一个相当干净的结果。 诀窍是忘记在从 EntityTypeConfiguration 派生的类中执行每个操作 并构建一个自定义的 BaseConfig,然后获取这个实例并为这个类添加细节。希望它能帮助其他人先用摘要做代码……

public  abstract class BosBaseObject
{
  public virtual Guid Id { set; get; }
  public virtual string ExternalKey { set; get; }
  public byte[] RowVersion { get; set; }
}
 public abstract class BosObjectDateManaged   :  BosBaseObject
{
    public DateTimeOffset ValidFrom { set; get; }
    public DateTimeOffset ValidTo { set; get; }
}
public class News : BosObjectDateManaged
{
    public String Heading { set; get; }
}



protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var conf = new BosBaseEntityConfiguration<News>();//Construct config for Type
        modelBuilder.Configurations.Add( conf );  // this has base mapping now
        var newsConf = new NewsConfiguration(conf); // now the Object specific properties stuff

    }

}
public class BosBaseEntityConfiguration<T> : EntityTypeConfiguration<T> where T : BosBaseObject
{
   public BosBaseEntityConfiguration()
   {
       // Primary Key
       this.HasKey(t => t.Id);

       //// Properties
       this.Property(t => t.Id).HasDatabaseGeneratedOption(databaseGeneratedOption: DatabaseGeneratedOption.None);

       this.Property(t => t.RowVersion)
           .IsRequired()
           .IsFixedLength()
           .HasMaxLength(8)
           .IsRowVersion();

       //Column Mappings
       this.Property(t => t.Id).HasColumnName("Id");
   }
}
 public class NewsConfiguration  
{
    public  NewsConfiguration(BosBaseEntityConfiguration<News> entity)
    {
        // Table Specific & Column Mappings
        entity.ToTable("News2");
        entity.Property(t => t.Heading).HasColumnName("Heading2");
    }
}

0
投票

对不起,我不能发表评论,但我会像你一样做,只是交换这两行

      modelBuilder.Configurations.Add( conf );  // this has base mapping now
      var newsConf = new NewsConfiguration(conf); // now the Object specific properties stuff
   to
       new NewsConfiguration(conf); // now the Object 
       modelBuilder.Configurations.Add( conf );  // this has base mapping now

这有助于英孚在专业领域的发展。


0
投票
public class BaseEntityTypeConfiguration<T> : IEntityTypeConfiguration<T> where T : BaseEntity
{
    public virtual void Configure(EntityTypeBuilder<T> entity)
    {
        entity.HasKey(e => e.Id);
    }
}


public class NewsEntityTypeConfiguration : BaseEntityTypeConfiguration<News>
{
    public override void Configure(EntityTypeBuilder<News> entity)
    {
        base.Configure(entity);
        entity.ToTable("News");
    }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new NewsEntityTypeConfiguration());
}
© www.soinside.com 2019 - 2024. All rights reserved.