Вставка и удаление объектов с помощью Linq to SQL с использованием различных контекстов данных - PullRequest
0 голосов
/ 12 марта 2011

У меня проблема с вставкой и удалением объектов в / из базы данных с использованием Linq to SQL при использовании различных контекстов данных. Код работает просто отлично, пока я вставляю и удаляю, используя тот же контекст. Однако использование одного и того же контекста для каждой функции не вариант, так как это создаст проблемы параллелизма, поскольку код используется для веб-службы.

Код написан на F #, но это не должно иметь никакого значения.

let CreateUser user =
    use context = new Rsvp(connectionString)
    context.Users.InsertOnSubmit(user)
    context.SubmitChanges()


let RemoveUserById user_id =
    use context = new Rsvp(connectionString)
    let user = GetUser user_id
    context.Users.DeleteOnSubmit(user)
    context.SubmitChanges()

Исключение выдается из DeleteOnSubmit следующим образом:

System.InvalidOperationException: Невозможно удалить объект, который не был присоединен.

Теперь вы можете подумать, что можете просто прикрепить объект к новому контексту данных. Однако это вызовет еще одно исключение:

System.NotSupportedException: была сделана попытка присоединить или добавить объект, который не является новым, возможно, был загружен из другого DataContext. Это не поддерживается.

Я тестирую это из тестового проекта C # по следующей методике

[TestMethod]
    public void Can_create_and_remove_a_new_user()
    {
        User user = new User();
        user.Name = "Test User";
        user.Email = "test@mail.com";
        user.Role_id = 1;

        UserModule.CreateUser(user);

        User inserted_user = UserModule.GetUserByEmail("test@mail.com");
        Assert.IsNotNull(inserted_user);

        UserModule.RemoveUserById(inserted_user.Id);
    }

Разве нельзя удалить / вставить один и тот же объект из разных контекстов?

EDIT: Друг прислал мне эту статью , которая может помочь решить проблему, но, похоже, она не является окончательным решением проблемы.

1 Ответ

1 голос
/ 12 марта 2011

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

Если вы хотите поиграть с некоторыми хорошими функциональными идеями, это может быть хорошим местом для реализации компоновщика вычислений, чтобы поддерживать контекст данных (то есть монаду состояний). Тогда вы могли бы написать:

let CreateUser user = datacontext {
  let! context = getCurrentContext()
  context.Users.InsertOnSubmit(user)     
  context.SubmitChanges()  }

Где getCurrentContext - это операция, которая возвращает контекст, который вы передаете. Вероятно, есть несколько примеров, как реализовать монаду состояний в F #. См. , например, эту статью .

...