![](/img/trans.png)
[英]InsertOnSubmit equivalent in DbContext.DbSet using Entity Framework 4 code first
[英]Conditionally select between different DbContext.DbSet (as template-parameter)?
场景:我有一个现有的数据库供我操作。 我转换数据并将它们映射到新表。 为了便于验证这些转换,我需要将它们放入单独的表中(以Test_为前缀)。 但我仍然需要生产布局的功能。 因此,我必须以某种方式将target-table作为模板参数提供给transform-task( Process()
)。
// existing Models
public virtual class DataRecord1
{
public Int32 Id { get; set; }
...
}
public virtual class DataRecord2
{
public Int32 Id { get; set; }
...
}
// new Tables
public virtual class Test_DataRecord1 : DataRecord1
{}
public virtual class Test_DataRecord2 : DataRecord2
{}
public partial class DatabaseContext : DbContext
{
public virtual DbSet<DataRecord1> DataRecord1 { get; set; }
public virtual DbSet<DataRecord2> DataRecord2 { get; set; }
// Test
public virtual DbSet<Test_DataRecord1> Test_DataRecord1 { get; set; }
public virtual DbSet<Test_DataRecord2> Test_DataRecord2 { get; set; }
}
转换可能在多个函数中使用多个上下文实例,因此传递上下文不是一种选择。
public class ProcessTask
{
// transform data
public void Process()
{
using( var context = new DatabaseContext() )
{
context.Configuration.AutoDetectChangesEnabled = false;
var data1 = context.DataRecord2
.Where( ... )
.ToList();
var data2 = context.DataRecord1
.Where( ... )
.ToList();
// operate and transform data
context.DataRecord1.AddRange( ... );
context.ChangeTracker.DetectChanges();
context.SaveChanges();
}
this.SubProcess();
}
private void SubProcess()
{
using( var context1 = new DatabaseContext() )
using( var context2 = new DatabaseContext() )
{
// operate on the data
}
}
}
public static class Main()
{
// current use:
new ProcessTask().Process();
// new functionality:
new ProcessTask<Mode.Test>.Process(); // somehow change the task, so that Test_DataRecord is used
}
如何修改Process()
以在DataRecords
和Test_DataRecords
之间进行有条件的选择?
您可以使用选择器方法对Process
方法进行参数化:
private void Process<T>(Func<DatabaseContext , DbSet<T>> selector)
where T : DataRecord
{
using( var context = new DatabaseContext() )
{
var dataRecords = selector(context);
context.Configuration.AutoDetectChangesEnabled = false;
var data = dataRecords
.Where( ... )
.ToList();
// operate and transform data
dataRecords.AddRange( ... );
context.ChangeTracker.DetectChanges();
context.SaveChanges();
}
}
您可以为不同的集合调用此方法:
public void ProcessDataRecord()
{
Process(context => context.DataRecords);
}
public void ProcessTest_DataRecord()
{
Process(context => context.Test_DataRecords);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.