获取 Base 对象属性的集中映射有什么技巧吗?
使用 EntityTypeConfiguration 时是否有抽象类的一些简单模式。
非常感谢任何提示。
我无法申报课程
Public class BaseEntityConfig<T> : EntityTypeConfiguration<T>
类似的问题,我无法得到工作的答案
如何创建和使用通用类 EntityTypeConfiguration
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");
}
}
上面的答案肯定有效,尽管这可能稍微干净一些,并且在 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 得出了上述解决方案......
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");
}
}
对不起,我不能发表评论,但我会像你一样做,只是交换这两行
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
这有助于英孚在专业领域的发展。
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());
}