2009-12-29 4 views
1

Раньше я создал страницу AddClient, которая (когда отправлено) передала объект-клиент, и я использовал db.AddToClient (obj) в моем репозитории, чтобы сохранить его. Легкий материал.Модель привязки с платформой Entity Framework (ASP.NET MVC)

Теперь у меня есть страница сведений, чье сохранение отправляет сообщение в действие «UpdateClient». Прежде чем это действие будет удалено, мое настраиваемое связующее устройство создаст объект Client, и его удобно передать в действие. Дело в том, что этот клиентский объект еще не связан с контекстом EF. Где подходящее место для этого? В modelbinder, или, может быть, когда мы получим его от контроллера, или, может быть, мы подождем, пока мы не сделаем вызов репозитория и не свяжем его там? Каков рекомендуемый процесс?

ответ

1

Из того, что я помню, вам нужно будет либо присоединить объект снова к контексту и установить его в качестве модифицированного

Или загрузите объект из базы данных и применить изменения.

Эта статья объясняет лучше:

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx#id0090022

Какую версию EF вы используете?

-1

Работа с базами данных должна быть помещена в вызов репозитория.

Вы непосредственно привязываетесь к объекту каркаса сущности в привязке к модели? Если нет, вам следует рассмотреть возможность сопоставления между вашим пользовательским объектом и объектом фреймворка сущности.

+0

Мои вызовы db находятся в репозитории.То, что я пытаюсь выяснить, - это когда назвать их, чтобы лучше использовать EF. Что касается вашего вопроса, я пытаюсь определить это с этими вопросами. Похоже, что я лучше всего использую EF, если я сначала привяжу запрос к объекту EF, чтобы он мог использовать параллелизм и лучшее состояние отслеживания. – RailRhoad

+0

Я бы не стал подвергать объект EF непосредственно «привязке модели», я буду использовать свой собственный объект домена или DTO и сопоставить этот объект с объектом EF. –

0

Если объект EF был создан вне контекста, вам необходимо указать Приложить объект к контексту.

См: http://msdn.microsoft.com/en-us/library/bb896271.aspx

+0

Если я подожду, чтобы подключиться после того, как я закончил свой объект, разве я не потеряю преимущества проверки параллельности EF? Кроме того, этот Attach смотрит на мой объект и синхронизирует его с одним в db? – RailRhoad

+0

Плюс, прикрепление объекта к контексту оставляет его неизменным. Разве я не хочу сначала запрашивать его (перед привязкой к модели) и затем привязывать его. Тогда это могло бы правильно определить право государства? – RailRhoad

+0

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

0

Я знаю, что это старый нить, но в интересах новых читателей:

Основываясь на своих наблюдениях, используя VS 2012, MVC 4 и EF 4.0 с тем, что есть объект EF для модели, которая представляет вернитесь к контроллеру.

На контроллере:

public ActionResult SubmitEFObject(tblData data, FormCollection col) 

"данные" будут иметь только свойство, используемое в представлении (@ Html.xxxFor), заполненное.

Похоже, что когда создается «данные», опубликованный FormCollection используется для установки свойств данных. Если у вас есть свойство, которое не было использовано, например DataID, то data.DataID будет иметь значение null/default. Добавьте «@ Html.Hidden (m => m.DataID)» к вашему представлению и THEN DataID будет заполнен.

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

// Note: error handling removed 
public tblData MergeWithDB(DBContext db, tblData data, params string[] fields) 
{ 
    tblData d = db.tblData.Where(aa => aa.DataID == data.DataID).Single(); 
    if (fields.Contains("Field1")) d.Field1 = data.Field1; 
    if (fields.Contains("Field2")) d.Field2 = data.Field2; 
    if (fields.Contains("Field3")) d.Field3 = data.Field3; 
    // etc... 
    return d; 
} 

на контроллере:

public ActionResult SubmitEFObject(tblData data, FormCollection col) 
{ 
    DataEntities db = new DataEntities(); 
    tblData d = MergeWithDB(db, data, col.AllKeys); 
    db.SaveChanges(); 
} 

Вы могли бы сделать это более универсальное с помощью отражения или, может быть более эффективным, пробегает по строке [] полям вместо все МСФА, но для моих целей это было «достаточно хорошо».

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