2010-05-31 5 views
0

У меня возникли проблемы с обновлением строки в моей базе данных с использованием Linq2Sql.Обновление строки базы данных из модели

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

Мои методы модели, такие как, как:

public void Update(Activity activity) 
{ 
    _db.Activities.InsertOnSubmit(activity); 
} 


public void Save() 
{ 
    _db.SubmitChanges(); 
} 

и код в мой контроллер любит, как:

[HttpPost] 
public ActionResult Edit(Activity activity) 
{ 
    if (ModelState.IsValid) 
    { 
     UpdateModel<Activity>(activity); 
     _activitiesModel.Update(activity); 
     _activitiesModel.Save(); 
    } 
    return View(activity); 
} 

Проблема у меня в том, что этот код вставляет новую запись в базу данных , хотя элемент модели, который я вставляю-в-submit, содержит поле первичного ключа.

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

Любые указатели в правильном направлении будет принята с благодарностью.

UPDATE:

Я использую инъекции зависимостей, чтобы создать экземпляр моего объекта DataContext следующим образом:

IMyDataContext _db; 

public ActivitiesModel(IMyDataContext db) 
{ 
    _db = db; 
} 
+0

Возможно, я ошибаюсь, но я собираюсь предположить, что проблема заключается в том, как создается экземпляр datacontext. – Ahmad

+0

Привет, Ахман. Контекст моей информации создается с помощью DI. Я обновляю свой вопрос с помощью кода создания экземпляра. –

+0

Хотя использование DI, что такое стиль жизни datacontext, переходный процесс, singleton, per-web-запрос и т. Д. Возможно, образ жизни выбранного вами контейнера DI по умолчанию действует, если вы не указали его. Я угадываю Вот :) – Ahmad

ответ

0

Я исправил эту проблему путем повторного получения и обновления моего объекта в методе обновления.

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

[HttpPost] 
public ActionResult Edit(Activity activity) 
{ 
    Activity myActivity = activitiesModel.getActivityById(activity.id); 
    myActivity.name = activity.name; 
    myActivity.date = activity.date; 
    _dbContext.SubmitChanges(); 
    return View(activity); 
} 

Это не мой точный код и точнее, я создал еще один частичный класс для моего datacontext и сохранил там код обновления.

0

Там должна быть вкладыш в случае использования метода InsertOnSubmit, это ожидаемый поведение.
Мы рекомендуем использовать метод Attach() в реализации метода Update(). Если у вас есть столбец IsVersion в объекте, тогда все просто, в другом случае вам придется передать исходные значения также и в Attach-вызове. Дополнительная информация доступна here in MSDN.

Смежные вопросы