Обновление данных с использованием Linq2Sql - PullRequest
2 голосов
/ 26 марта 2011

У меня есть это в моем MVR ActionResult

    [HttpPost]
    public ActionResult _ChangeDetails( [Bind(Prefix="ContactDetails")] userDetail UserDetail )
    {
        MemberChangeDetailsFormViewModel fvm = new MemberChangeDetailsFormViewModel();

        if (ModelState.IsValid)
        {
            //save
            UserDetailRepository repository = new UserDetailRepository();
            repository.Save(UserDetail);
            return RedirectToAction("Index", "Member");
        }

        fvm.ContactDetails = UserDetail;

        return View(fvm);
    }

Затем в моем хранилище у меня есть;

if (userDetail.id != Guid.Empty)
{
    userDetail orig = dc.userDetails.Where(x => x.id == userDetail.id).Single();
    dc.userDetails.Attach(userDetail, orig);
    dc.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, userDetail);
    dc.SubmitChanges();
}

Однако «присоединение» генерирует ошибку; Невозможно добавить объект с ключом, который уже используется.

Я понимаю, что это вызвано тем, что к L2S уже подключен объект.Я пытался сделать это с и без объекта orig, но получаю одно и то же сообщение.

Что было бы лучшим способом обновить данные в таблице из модели?

1 Ответ

3 голосов
/ 27 марта 2011

Linq-to-SQL не может работать с двумя объектами с одинаковым ключом в одном и том же контексте данных.Некоторые параметры:

Опция 1: Используйте два разных контекста данных:

public void Update(UserDetail modifiedUser)
{
    using (UserDetailDataContext dc1 = new UserDetailDataContext())
    using (UserDetailDataContext dc2 = new UserDetailDataContext())
    {
        UserDetail originalUser = dc1.UserDetails.Single(u => u.id == modifiedUser.id);
        dc2.UserDetails.Attach(modifiedUser, originalUser);
        dc2.SubmitChanges();
    }
}

Опция 2: Не тяните исходный объект;аннотируйте новый объект как обновление:

public void Update(UserDetail modifiedUser)
{
    using (UserDetailDataContext dc = new UserDetailDataContext())
    {
        dc.UserDetails.Attach(modifiedUser);
        dc.Refresh(RefreshMode.KeepCurrentValues, modifiedUser);
        dc.SubmitChanges();
    }
}

В этом вопросе есть еще обсуждение , и у Рика Стрэла есть запись в блоге , в которой рассматривается стратегия на основе версий, если вы хотите изменить схему таблицы, добавив метку времени.

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