从EF上下文中进行批量插入时,是否可以包含单个子表?

时间:2019-02-04 19:05:54

标签: dapper dapper-extensions entity-framework-extensions

我们有一个庞大的EF上下文模型。我只想从一个父表及其子表中批量插入数据。 BulkSaveChanges花费的时间太长,我正在玩BulkInsert,但是当我设置options.IncludeGraph = true时,它花费的时间甚至更长。有没有一种方法可以防止Dapper搜索所有相关对象,而仅从Parents表和Child中插入数据?

1 个答案:

答案 0 :(得分:1)

您可以两次拨打批量插入吗?一个给父母,一个给孩子

public static void main(String[] args) throws Exception {
    final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

    DataSource<Integer> input = env.fromElements(1, 2, 3);
    DataSet<Tuple3<Integer, String, Double>> result = input.map((MapFunction<Integer, Tuple3<Integer, String, Double>>) integer -> Tuple3.of(integer, integer.toString(), 42.0));

    Path outputPath = new Path("hdfs:///foobar");
    result.output(new MyCsvOutputFormat(outputPath));

    env.execute();
}

private static class MyCsvOutputFormat<T extends Tuple> extends CsvOutputFormat<T> {

    public MyCsvOutputFormat(Path outputPath) {
        super(outputPath);
    }

    @Override
    public void open(int taskNumber, int numTasks) throws IOException {
        try (PrintWriter wrt = new PrintWriter(stream)) {
            wrt.println("Foo|bar|foobar");
        }
        super.open(taskNumber, numTasks);
    }
}
  

在插入父母之后,孩子仍然具有ParentId = 0

我们希望很快改进这一部分,但目前,您需要为孩子分配ParentId。

例如:

context.BulkInsert(parents);
context.BulkInsert(parents.SelectMany(x => x.Childs));