Существует масса информации по этому вопросу, но даже после чтения в течение многих часов я, кажется, не могу заставить это работать так, как я хочу.
Я пытаюсь обновить объект User, передавая объект User и сравнивая изменения, внесенные в объект User, который я извлекаю из базы данных. Я всегда получаю NotSupportedException при использовании этого метода:
Была предпринята попытка присоединить или
Возможно, добавьте объект, который не является новым
будучи загруженным из другого
DataContext. Это не поддерживается.
Вот как я пытаюсь это сделать:
public void SaveUser(User User)
{
using (DataContext dataContext = new DataContext(WebConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
// New user
if (User.UserID == 0)
{
dataContext.Users.InsertOnSubmit(User);
}
// Existing user
else
{
User dbUser = dataContext.Users.Single(u => u.UserID.Equals(User.UserID));
Type t = dbUser.GetType();
foreach (PropertyInfo p in t.GetProperties())
{
if (p.CanWrite & p.GetValue(dbUser, null) != p.GetValue(User, null))
{
p.SetValue(dbUser, p.GetValue(User, null), null);
}
}
//dataContext.Refresh(RefreshMode.KeepCurrentValues, dbUser);
}
dataContext.SubmitChanges();
}
}
Закомментированная строка, которую я тоже пробовал без комментариев, но это не помогло.
Если я закомментирую цикл foreach () и добавлю строку вроде dbUser.UserName = "Cheese"; Это обновит имя пользователя в базе данных штрафа. Это заставляет меня поверить, что это связано с тем, что цикл foreach () изменяет объект dbUser, что приводит к сбою.
Когда я отлаживаю объект dbUser, он, по-видимому, корректно получает все изменения от объекта User, переданного в качестве аргумента.
Я также немного прочел оптимистичный параллелизм и добавил столбец в таблицу меток времени типа данных, но, похоже, это тоже не имело никакого эффекта.
Что именно я здесь не так делаю?
Как я могу получить это для общего обнаружения того, что изменилось, и правильно сохранить изменения в базе данных?