C# 实体框架和对象模式

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

我有一个包含多个对象的程序(比如 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);
        }
    }
}
c# entity-framework
1个回答
0
投票

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.
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.