【问题标题】:In .net codefirst can I create classes dynamically?在 .net codefirst 中,我可以动态创建类吗?
【发布时间】:2011-05-22 17:47:48
【问题描述】:

这是场景:

我正在编写一个数据加载器,它接受来自某些 DB2 目录表的二进制数据。我为 DB2 表结构创建了 POCO,并在将数据加载到其中之前使用 Code First 创建 SQLServer DB。我首先使用代码并为每个数据集创建新数据库的原因之一是我正在处理不同版本的 DB2,这些版本在版本之间添加了列、移动位置的列甚至删除的列。

在开发过程中,我根据我的数据来自哪个版本的 DB2,对 POCO 的不同版本进行注释和取消注释。但现在我想要一个通用版本。一个明显的解决方案是根据 DB2 版本设置一组这些 POCO,并在其名称上加上后缀,以及一组 DBContext 类。这将要求使用 DBContext 的代码的复杂性达到一个全新的水平。

那么有没有办法根据 DB2 版本动态生成 POCO,然后让 CodeFirst 从那里获取它?

【问题讨论】:

  • 如果可以,您将如何使用这些对象?显然,如果它们在编译时不存在,你就不能对它们进行编码。你准备好对他们使用反射和数据绑定(反射)了吗?
  • 我想做的是让他们以适当的结构创建数据库,并且它们用于根据 POCO 结构动态构建数据集的数据加载器。

标签: .net code-generation mef ef-code-first code-first


【解决方案1】:

如果我理解正确,您是在尝试从不同的 DB2 数据库中获取数据,但模式略有不同,但希望将其加载到单个 SQL Server 模式中?

您可以考虑使用映射文件。下面的示例假设您有两个源 DB2 模式(“Schema1”和“Schema2”)和一个目标 SQL 模式。有一个类型(“Entity1”),但有两个 POCO,分别代表两个 DB2 模式(“Entity1FromSchema1”和“Entity1FromSchema2”)。

public class Entity1FromSchema1Mapping : EntityTypeConfiguration<Entity1FromSchema1>
{
    public Entity1FromSchema1Mapping()
    {
        this.ToTable("Entity1");
        this.HasKey( ... );
        this.Property( ... );
        ...            
    }
}

public class Entity1FromSchema2Mapping : EntityTypeConfiguration<Entity1FromSchema2>
{
    public Entity1FromSchema2Mapping()
    {
        this.ToTable("Entity1");
        this.HasKey( ... );
        this.Property( ... );
        ...            
    }
}

请注意,两个不同实体的两个映射文件都映射到同一个 SQL Server 表。

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 2016-12-12
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多