我有一个包含多个对象的程序(比如 200 个)。
此外,我有实体框架,它为每一个声明了一个
DbSet
。
这些对象相似(但不相同)。我觉得工厂模式在这里值得动态构建对象以及
DbContext
。
是否可以动态构建一个
DbContext
,与对象工厂对齐?
奖励:可以在表格或文本数据而不是代码中定义对象吗? (与业务共享
.csv
文件比几百行c#更容易)
namespace nameObjectA
{
public class Object A
{
public Prop1
public Prop2
...
}
}
namespace nameObjectZ
{
public class Object Z
{
public Prop1
public Prop2
...
}
}
namespace DatabaseOps
{
public class OpsContext: DbContext
{
public DbSet<ObjectA> ObjectsA { get; set }
// ...
public DbSet<ObjectZ> ObjectsZ { get; set }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ObjectA>();
modelBuilder.Entity<ObjectA>().Property(x => x.Prop1);
modelBuilder.Entity<ObjectA>().Property(x => x.Prop2);
// ...
modelBuilder.Entity<ObjectZ>();
modelBuilder.Entity<ObjectZ>().Property(x => x.Prop1);
modelBuilder.Entity<ObjectZ>().Property(x => x.Prop2);
}
}
}
Fluent-api 可用于配置这些类似的实体。
首先创建一个具有以下相同属性的接口:
public interface IFooInterface
{
string FooProperty { get; set; }
...
}
然后为 EntityTypeBuilder 创建一个扩展类并创建一个静态方法,如下所示:
public static class FooEntityTypeBuilderExtensions
{
public static void ConfigureByConvention(this EntityTypeBuilder b)
{
b.TryConfigureFooCommonFields();
}
public static void TryConfigureFooCommonFields(this EntityTypeBuilder b)
{
if (b.Metadata.ClrType.IsAssignableTo<IFooInterface>())
{
b.Property(nameof(IFooInterface.FooProperty))
.HasMaxLength(FooConstant.BarLength)
.HasColumnName(nameof(IFooInterface.FooProperty));
...
}
}
}
然后使用 Fluent-api 配置您的实体:
public class FooConfiguration : IEntityTypeConfiguration<Foo>
{
public void Configure(EntityTypeBuilder<Foo> builder)
{
builder.ConfigureByConvention();
....
// configure not common properties.
}
}