实体框架表名称在运行时映射

时间:2015-02-18 10:34:40

标签: entity-framework tablename

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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]