Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многослойная архитектура, WCF и Entity Framework, Обновления сущности в клиент-серв. прил. 
V
    Опции темы
Kero
  Дата 20.5.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 10.5.2006
Где: Винница,Украина | | Реал

Репутация: нет
Всего: 1



Привет!
 smile 
У меня есть многослойное, как бутерброд приложение:
Слои:

1. Слой данных. Вмещает в себя модель БД, как edmx файл и оболочку которая использует эту модель как контекст

2. Слой сервиса. WCF сервис лежит рядом с слоем данных и отдаёт жаждущим методы CRUD. Они возращают либо List<МояСущность> либо Сущность как экземпляр класа

3. Прокси слой: Служит клиентской точкой приёма данных

4. Слой интерфейса. Собсна интерфейс


EF ObjectContext, как контейнер-контекст нашего общения с базой, имеет славную способность: когда мы меняем значение поля у обьекта: запускаеться делегат который рассказывает контексту мол "Брат, прикинь, обьект изменился! Когда юзер запустит SaveChanges() мы в базе поменяем запись!".
Это канеш супер, но если работать с многослойным приложением этот чудесный функционал теряеться так как при изменении значения поля обьекта, обьект не запустит делегат контекста. Тоесть попросту обновить не получиться.

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

Сразу напрашиваеться 2 решения:
1. Идиотское. Хардкодить:
Код


//Скормим методу сущность которую мы изменили у клиента. Она заведомо не привязана к контексту
public void updateUser(User inputEntity)
{
   User changingEntity = НайтиСущностьПоКлючуСущностиПринятойАргументом(inputEntity.ключ);
   //Мы нашли сущность которая привязана к контексту и ее изменения будут учтены при SaveChanges
   changingEntity.User = inputEntity.User
   changingEntity.Money = inputEntity.Money
   //И дальше заниматься бредом копируя поля. это глупо
   Context.SaveChanges();
}


2. Поумней, но я не могу закодить:
Код

public void updateUser(EntityObject inputEntity)
{
  EntityObject changingEntity = НайтиСущностьПоКлючуСущностиПринятойАргументом(inputEntity.ключ);
  foreach( property p in inputEntity)
 {
   changingEntity.props[p] = inputEntity.props[p];
   Context.SaveChanges();
  }
}



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

Тоесть я хочу создать универсальный метод который копирует все поля сущностей в цикле.


Убер кодеры - жду помощи, и идей! Проект горит! Награжу плюсами толковые идеи-мне не жалко а вам приятно!



PM MAIL ICQ MSN   Вверх
Idsa
Дата 21.5.2009, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



ObjectContext.ApplyPropertyChanges


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Kero
  Дата 21.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 10.5.2006
Где: Винница,Украина | | Реал

Репутация: нет
Всего: 1



Решено. Спасибо 
Idsa!
PM MAIL ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0402 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.