Как мне вставить список объектов с помощью Entity Framework 6 в один INSERT вместо создания нового метода для каждого объекта? - PullRequest
0 голосов
/ 30 мая 2020

У меня есть объект текущего сценария (тест NUnit), у которого есть результат, заголовок, теги ...; Каждый сценарий ios в списке сценариев ios Я хочу добавить его в реляционную базу данных mysql в специальной c таблице:

Test table -> Id, Name(scenario.Title), CreationDate
Tags table -> Id, Name(scenario.Tags)
Step table -> Id, Name(scenario.Steps)
TestStep table -> Id, TestId,StepId
TestTags table -> TestId, TagId........and so on

объект_сценария

Сейчас у меня текущая реализация:

public Test AddTest(Scenario Scenario, Fixture Fixture) {
    var test_scenario = StContext.Tests.AsEnumerable().SingleOrDefault(Test = >Test.Title == Scenario.Title);
    if (test_scenario != null) {
        return test_scenario;
    }

    test_scenario = new Test {
        Id = SequentialGuidGenerator.NewSequentialGuid(SequentialGuidTypeEnum.SequentialAsBinary),
        CreationDate = DateTime.UtcNow,
        Title = Scenario.Title,
        FixtureId = Fixture.Id
    };

    return StContext.Tests.Add(test_scenario);
}

public void AddStep(List < TestStack.BDDfy.Step > Steps, UnitOfWork UnitOfWork) {
    foreach(var step in Steps) {
        var single_step = new Step();
        if (StContext.Steps.Any(M = >M.Name == step.Title)) continue;

        single_step.Id = SequentialGuidGenerator.NewSequentialGuid(SequentialGuidTypeEnum.SequentialAsBinary);
        single_step.Name = step.Title;
        StContext.Steps.Add(single_step);
    }
    UnitOfWork.SaveChanges();
}

public void AddTestSteps(Test TestData, IEnumerable < Step > StepData, IEnumerable < StepCategory > StepModifiers, int StepIndex) {
    var step_id = StepData.First().Id;
    var test_step = StContext.TestSteps.FirstOrDefault(Step = >Step.StepId == step_id);
    if (test_step != null) {
        return;
    }

    test_step = new TestSteps {
        Id = SequentialGuidGenerator.NewSequentialGuid(SequentialGuidTypeEnum.SequentialAsBinary),
        TestId = TestData.Id,
        StepId = StepData.FirstOrDefault().Id,
        StepModifierId = StepModifiers.FirstOrDefault().Id,
        Order = StepIndex
    };

    StContext.TestSteps.Add(test_step);
}

И код клиента:

foreach(var scenario in item.Scenarios) {
    var test_data = UnitOfWork.Tests.AddTest(scenario, fixture_data);
    var step_data = UnitOfWork.Steps.AddStep(scenario.Steps, UnitOfWork);
    UnitOfWork.TestSteps.AddTestSteps(test_data, step_data, step_modifiers, step_index);

    UnitOfWork.Tags.AddTags(scenario.Tags, UnitOfWork);
    var tags_data = UnitOfWork.Tags.GetAll().Where(c = >test.Tags.Contains(c.Name));
    UnitOfWork.TestTags.AddTestTags(test_data, scenario.Tags, tags_data, UnitOfWork);
}

Вопрос: 1. Есть ли способ лучше добавления всех данных из объекта сценария в каждую отдельную таблицу спецификаторов c? может быть прямо в foreach l oop вместо добавления отдельных методов? 2. Есть ли лучший способ передать данные из одной таблицы в две другие вместо того, чтобы сохранять их в переменной var test_data = UnitOfWork.Tests.AddTest(scenario, fixture_data); и затем передавать их следующему методу.

...