Можно ли хранить ObjectContext на клиенте при использовании WCF и Entity Framework? - PullRequest
0 голосов
/ 21 марта 2010

У меня есть служба WCF, которая выполняет операцию CRUD для моей модели данных: Добавить, Получить, Обновить и Удалить. И я использую Entity Framework для моей модели данных. С другой стороны, есть клиентское приложение, которое вызывает методы службы WCF.

Например, у меня есть класс Customer:

[DataContract]
public class Customer
{
   public Guid CustomerId {get; set;}
   public string CustomerName {get; set;}
}

и служба WCF определяет этот метод:

public void AddCustomer(Customer c)
{
    MyEntities _entities = new MyEntities();
    _entities.AddToCustomers(c);
    _entities.SaveChanges();
}

и клиентское приложение передает объекты службе WCF:

var customer = new Customer(){CustomerId = Guid.NewGuid, CustomerName="SomeName"};
MyService svc = new MyService();
svc.Add(customer); // or svc.Update(customer) for example

Но когда мне нужно передать большое количество объектов в WCF, это может быть проблемой производительности, потому что мне нужно создавать ObjectContext каждый раз, когда я делаю Add (), Update (), Get () или Delete ().

Я думаю о том, чтобы сохранить ObjectContext на клиенте и передать ObjectContext в методы wcf в качестве дополнительного параметра.

Можно ли создать и сохранить ObjectContext на клиенте и не создавать его заново для каждой операции? Если это не так, как можно ускорить передачу огромного количества данных в службу wcf?

Сергей

Ответы [ 3 ]

3 голосов
/ 21 марта 2010

Нет, ObjectContext не может быть сериализован через вызов службы WCF.

Текущая версия структуры сущностей на самом деле не имеет никакой поддержки для n-уровневых приложений, подобных этой.

У нас есть n-уровневое приложение, использующее инфраструктуру сущностей, и мы каждый раз отсоединяем наши объекты от ObjectContext и делаем повторное создание и повторное присоединение для каждого вызова, и это прекрасно работает. Похоже, что для воссоздания не требуется значительных затрат производительности (SQL-сервер в любом случае будет объединять соединения с базой данных), поэтому, если вы не делаете что-то, требующее действительно высокой пропускной способности, не начинайте преждевременную оптимизацию. Просто запустите его, а затем профилируйте. Если честно, самой большой проблемой для вас будет вызов службы WCF и передача данных по сети в любом случае, поэтому, если вы хотите повысить производительность, минимизируйте количество передаваемых данных, а не беспокойтесь о вашем ObjectContext. Или вы можете создать сервисный вызов, который берет список объектов и добавляет их все одновременно.

Однако EF4 сделает это лучше. Взгляните на эту статью MSDN для получения дополнительной информации о поддержке n-уровня в EF4. Если вы работаете с бета-версией или месяц ждете релиза, возможно, стоит взглянуть.

2 голосов
/ 21 марта 2010

Класс ObjectContext в Entity Framework разработан на основе концепции Единицы работы .Его целью является отслеживание ряда изменений, внесенных в данные, содержащиеся в объектах сущностей, а затем применение этих изменений в виде пакета к базовой базе данных (с помощью метода ObjectContext.SaveChanges ).Единица работы имеет четко определенные границы и рассчитана на длительный период времени.В Entity Framework единица работы реализуется через ObjectContext следующим образом:

using (var db = new ObjectContext()) // The unit of work starts with the constructor
{
    // perform work
} // The unit of work ends with the Dispose method

ObjectContext предназначен для создания и удаления ad-hoc всякий раз, когда необходимо выполнить некоторую работу надданные в базе данных, поэтому она разработана для облегчения в этом смысле.При этом я не верю, что хранение долгоживущего экземпляра ObjectContext повысят производительность приложения.Напротив, это приведет к тому, что экземпляр ObjectContext будет занимать больше памяти, так как он продолжает отслеживать больше операций.

Если вам нужно передать большой объем данных через сеть, лучшее, что вы можете сделать, это использовать быстрый и легкий протокол связи .В WCF вы можете использовать netTcpBinding , который передает сообщения в двоичном формате через TCP-соединение.Важно помнить, что это работает, только если вы используете .NET на обоих концах, так как используемый двоичный формат специфичен для .NET.

0 голосов
/ 21 марта 2010

Нет, вы не можете хранить ObjectContext на клиенте (в чем смысл использовать WCF таким образом?), Но вы можете реализовать сохранение изменений задержки в Service или создать метод AddCostumers (Customer [] Customers)

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