Вставленная существующая ссылочная сущность при попытке вставить корень в LINQ to SQL - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть две модели в LINQ to SQL. Первый - это сотрудник, а второй - должность. Есть данные позиции, которые я уже вставил в таблицу позиций. На эти данные будет ссылаться модель Employee.

Position {
    int id,   //auto increament
    string name,
    string description, 
}

Employee {
    int id,
    string name,
    Position position,
}

Логика, когда я хочу создать сотрудника:

  1. Я создаю EmployeCreate и присваиваю имя сотрудника и должность ID
  2. Найти позицию по Id, используя репозиторий позиций.
  3. Создать модель сотрудника. Присвойте основанную модель позиции из второго шага
  4. Вставьте сотрудника с помощью репозитория сотрудника и отправьте изменения

Я думаю, что мои шаги правильные, но Основанные позиции снова вставляются в базу данных, обычно они не вставляются, поскольку данные уже существуют в базе данных.

Мой сервис сниппетов выглядит следующим образом:

EmployeService {
    //property and constructor

    AddEmployee(EmployeeCreate command) {
        var employee = EmployeeFactory.Create(command);
        var possition = _positionRepository.GetById(command.possitionId);

        using (var tx = new TransactionScope())
        {
            employee.Position = possition;
            _employeeRepository.InsertOnSubmit(employee);

            _employeeRepository.SubmitChanges();
            tx.Complete();
        }   
    }
}

EDIT Я создаю универсальный репозиторий Linq. Сотрудник и должность расширяет общий репозиторий Linq.

public class LinqRepository<T> : IRepository<T>, IRepository where T : class
    {

        protected readonly DataContext _dataContext;

        public LinqRepository(IDataContextProvider dataContextProvider)
        {
            _dataContext = dataContextProvider.DataContext;
        }
}

1 Ответ

1 голос
/ 08 сентября 2011

Здесь вам не нужен TransactionScope, если вы не пытаетесь отправить изменения в нескольких контекстах.SubmitChanges внутренне создает транзакцию для запроса, чтобы покрыть несколько операций вставки / обновления / удаления, запрошенных как часть submitchanges.Единственное время, когда вам нужно явно управлять контекстом, это когда у вас есть несколько контекстов / соединений, которые охватываются вызовом.

Поведение, которое вы видите, указывает, что позиция может быть выбрана контекстом, отличным от контекста.который вы используете при вставке сотрудника в _employeeRepostiory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...