【问题标题】:Entity framework table names mapping at runtime实体框架表名在运行时映射
【发布时间】:2015-02-18 10:34:40
【问题描述】:

我需要在不中断数据库工作的情况下导入大量数据。所以有两个表:Data 和 DataTemp(它们是相同的)。首先将数据上传到临时表,然后通过备份 Data 表并将 DataTemp 重命名为 Data 来交换表(此示例已简化 - 不止两个表)。本项目使用实体框架。

所以问题是:是否可以使用实体框架来使用 DataTemp 而无需复制架构中的 Data 表?有没有办法在执行最终 sql 之前编辑它以临时替换表名? OnModelCreating 不适合,因为它被调用一次,但我需要在不同时间使用这两个表。

谢谢!

【问题讨论】:

  • 多个 DbContext 模型相同但根据需要配置不同的情况呢?
  • 似乎是个好主意。我会试试看。谢谢!
  • 如果第二个 DbContext 使用相同的架构,则意味着它也使用相同的映射并将数据保存到相同的表中。
  • 如果您使用DbModelBuilder 和可能的EntityTypeConfiguration 而不是数据注释来定义表映射,则不会,这是他的表之间唯一不同的地方
  • 请注意,我自己没有尝试过该解决方案,因此为什么它是评论而不是答案

标签: entity-framework tablename


【解决方案1】:
public class Datum
{
    public int Id { get; set; }
}

public class DataContext : DbContext
{
    public DbSet<Datum> Data { get; set; }
}

public class DataTempContext : DataContext
{
    protected override void OnModelCreating(DbModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.Entity<Datum>().ToTable("DataTemp");
    }
}

编辑

这对我有用。

使用旧的:

        using (var context = new DataContext())
        {
            // illustrate original table name, Data
            Console.WriteLine(context.Data.ToString());
            Console.WriteLine();

            // Add some real data, for LinqPad
            context.Data.Add(new Datum());
            context.SaveChanges();
        }

WriteLine 的 SQL 输出:

            SELECT
                [Extent1].[Id] AS [Id],
                FROM [Data] AS [Extent1]            

使用新的:

        using (var context1 = new DataContext())
        using (var context2 = new DataTempContext())
        {
            // copy old table to new
            foreach (var d in context1.Data)
                context2.Data.Add(d);
            context2.SaveChanges();
        }

        using (var context = new DataTempContext())
        {
            // illustrate different table name, DataTemp
            Console.WriteLine(context.Data.ToString());

            Console.ReadKey();
        }

WriteLine 的 SQL 输出:

            SELECT
                [Extent1].[Id] AS [Id],
                FROM [DataTemp] AS [Extent1]

【讨论】:

  • 谢谢。试过这个。不调用 OnModelCreating 并将数据保存到 context1 表中。
  • 奇怪...你确定context2被初始化为DataTempContext吗?我并不总是尝试使用编译器发布代码,但这次我做到了,而 遇到的问题是我最终使用了 Data.sdf 和 DataTemp.sdf SQL CE DB 文件,因为DbContext 的默认连接字符串就是这样做的:但是,生成的 SQL 清楚地将 [DataTemp] 显示为表名,所以我很满意它的工作原理。
  • @JohnCastleman 修复默认连接字符串错误,您可以调用DataTempContext 的基本DbContext 的构造函数来设置连接字符串,即:public DataTempContext() : base("DataContext") { }
  • 另外,它可能不喜欢从DataContext 继承。不确定 EF 在幕后做了什么,但是创建一个两个上下文都继承自的抽象类可能会有所作为
  • 找出我的问题所在 - 连接字符串。删除了 meta 和 UnintentionalCodeFirstException。现在可以了。谢谢!
猜你喜欢
  • 2019-01-22
  • 2014-04-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2011-12-18
  • 2013-01-17
  • 2015-08-17
相关资源
最近更新 更多