- Пул з'єднання обробляється, як і в будь-якому іншому додатку ADO.NET. Підключення сутності все ще використовує традиційне підключення до бази даних з традиційним рядком з'єднання. Я вважаю, що ви можете вимкнути об'єднання з'єднань у рядку з'єднання, якщо ви не хочете його використовувати. (докладніше про об'єднання підключення до SQL Server (ADO.NET) )
- Ніколи не використовуйте глобальний контекст. ObjectContext внутрішньо реалізує декілька моделей, включаючи карту ідентичності та блок роботи. Вплив використання глобального контексту відрізняється від типу програми.
- Для веб-додатків використовуйте один контекст на запит. Для веб-служб використовуйте єдиний контекст за виклик. У додатках WinForms або WPF використовуйте один контекст на форму чи на кожного презентатора. Можуть бути деякі особливі вимоги, які не дозволять використовувати цей підхід, але в більшості ситуацій цього достатньо.
Якщо ви хочете дізнатися, який вплив має один об'єктний контекст для програми WPF / WinForm, перегляньте цю статтю . Йдеться про сесію NHibernate, але ідея така ж.
Редагувати:
Якщо ви використовуєте EF, він за замовчуванням завантажує кожну сутність лише один раз у контексті. Перший запит створює об'єкт instace і зберігає його внутрішньо. Будь-який наступний запит, для якого потрібна сутність із тим самим ключем, повертає цей збережений екземпляр. Якщо значення в сховищі даних змінилися, ви все одно отримуєте об'єкт зі значеннями з початкового запиту. Це називається схемою карти ідентичності . Ви можете змусити контекст об'єкта перезавантажити об'єкт, але він перезавантажить один спільний екземпляр.
Будь-які зміни, внесені в сутність, не зберігаються, поки ви не зателефонуєте SaveChanges
за контекст. Ви можете робити зміни в декількох об'єктах і зберігати їх одночасно. Це називається схемою одиниці роботи . Ви не можете вибірково сказати, яку модифіковану додану сутність ви хочете зберегти.
Комбінуйте ці два візерунки, і ви побачите кілька цікавих ефектів. У вас є лише один екземпляр сутності для всієї програми. Будь-які зміни сутності впливають на всю програму, навіть якщо зміни ще не зберігаються (здійснюються). У більшості випадків це не те, чого ти хочеш. Припустимо, у вас є форма редагування в додатку WPF. Ви працюєте з цією суттю і вирішуєте скасувати складне редагування (зміна значень, додавання пов'язаних об'єктів, видалення інших суміжних об'єктів тощо). Але сутність вже змінена в спільному контексті. Що ти робитимеш? Підказка. Я не знаю про будь-які відміни змін або скасування змін ObjectContext
.
Я думаю, нам не доведеться обговорювати серверний сценарій. Просто обмін однією суттю між кількома запитами HTTP або викликами веб-служб робить вашу програму марною. Будь-який запит може просто викликати SaveChanges
і зберегти часткові дані з іншого запиту, оскільки ви обмінюєтесь єдиною одиницею роботи між усіма ними. У цьому також буде інша проблема - контекст і будь-які маніпуляції з сутностями в контексті або підключення до бази даних, використовувані контекстом, не є безпечними для потоків.
Навіть для програми лише для читання глобальний контекст не є хорошим вибором, тому що ви, ймовірно, бажаєте свіжих даних кожного разу, коли запитуєте програму.