Entity framework table 名称在运行时映射
Entity framework table names mapping at runtime
我需要在不中断数据库工作的情况下导入大量数据。所以有两个 table:Data 和 DataTemp(它们是相同的)。首先将数据上传到临时 table,然后通过备份数据 table 并将 DataTemp 重命名为数据来交换 tables(此示例已简化 - 有两个以上 tables)。 Entity Framework用于本项目。
所以问题是:是否可以使用 entity framework 来使用 DataTemp 而无需复制架构中的数据 table?有没有办法在执行最终 sql 之前编辑它以临时替换 table 名称? OnModelCreating 不适合,因为它被调用了一次,但我需要在不同时间使用两个 table。
谢谢!
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();
}
SQL WriteLine 输出:
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();
}
SQL WriteLine 输出:
SELECT
[Extent1].[Id] AS [Id],
FROM [DataTemp] AS [Extent1]
我需要在不中断数据库工作的情况下导入大量数据。所以有两个 table:Data 和 DataTemp(它们是相同的)。首先将数据上传到临时 table,然后通过备份数据 table 并将 DataTemp 重命名为数据来交换 tables(此示例已简化 - 有两个以上 tables)。 Entity Framework用于本项目。
所以问题是:是否可以使用 entity framework 来使用 DataTemp 而无需复制架构中的数据 table?有没有办法在执行最终 sql 之前编辑它以临时替换 table 名称? OnModelCreating 不适合,因为它被调用了一次,但我需要在不同时间使用两个 table。
谢谢!
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();
}
SQL WriteLine 输出:
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();
}
SQL WriteLine 输出:
SELECT
[Extent1].[Id] AS [Id],
FROM [DataTemp] AS [Extent1]