Як спочатку від'єднати об'єкти в Entity Framework Code?


Відповіді:


156

Якщо ви хочете від'єднати існуючий об’єкт, дотримуйтесь порад @ Slauma. Якщо ви хочете завантажити об'єкти без відстеження змін, використовуйте:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

Як зазначається в коментарі, це не повністю відмежовує суб'єкти. Вони все ще додаються і ледачі завантажувальні роботи, але сутності не відстежуються. Це слід використовувати, наприклад, якщо ви хочете завантажити об'єкт лише для читання даних, і ви не плануєте їх змінювати.


3
@Ladislav: Це, мабуть, саме те, що мав на увазі кодер Лол. Я ніколи не використовував і не думав про цей метод, хоча часто завантажую списки об'єктів і одразу розміщую контекст, щось подібне using(ctx){ return ctx....ToList(); }. У таких випадках використання AsNoTracking()було б багато сенсу, оскільки я б економив заповнення контексту об'єкта без потреби. Я думаю, це, мабуть, матиме корисність для продуктивності та споживання пам'яті, особливо для великих списків, правда?
Слаума

1
@Slauma: Так, це має перевагу від продуктивності. Саме тому цей метод існує. Використання цього підходу в API ObjectContext трохи складніше.
Ладислав Мрнка

2
Це відключає ліниве завантаження?
Шон Мклін

3
Насправді це не відключить ледачу завантаження, вона лише відключить відстеження змін та покращить продуктивність = сутність все ще додається Я знайшов це після відповіді на це запитання, тож слід позначити один як @ Слаума як дійсну відповідь.
Ладислав Мрнка

1
Це я хочу. Я хочу ледачого завантаження та здатності змінювати лише відокремлену сутність.
Шон Мклін

255

Це варіант:

dbContext.Entry(entity).State = EntityState.Detached;

3
Чи можу я це зробити під час отримання об'єктів, які повертають IQueryable?
Шон Мклін

1
@Lol coder: Я не впевнений, чи правильно я вас розумію, але entityповинен бути матеріалізованим об'єктом типу, який є частиною ваших модельних класів (Person, Customer, Order тощо). Ви не можете безпосередньо перейти в IQueyable <T> у dbContext.Entry(...). Це питання, яке ви мали на увазі?
Слаума

9
@EladBenda: Це залежить. Якщо ви хочете від'єднати об'єкт, який уже приєднаний до контексту, встановіть стан Detached. Якщо ви хочете завантажити об'єкти з БД, не прив’язуючи їх до контексту (відстеження змін), використовуйте AsNoTracking.
Слаума

1
Я знайшов цікаву проблему з цим методом. Навіть незважаючи на те, що сутність може бути проксі-класом, ліниве завантаження не працюватиме, якщо ви зміните його стан на Detached.
kjbartel

4
@kjbartel: така очікувана поведінка, оскільки сутність не має зв'язку з контекстом.
Рікардо Соуза
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.