Хочу дополнить к пункту 6.Мониторить запросы, которые генерирует LINQ.
Это очень актуально для запросов с join-ами. Заметил, что если использовать более 1-го join-а и оператор into, в 80% случаев linq генерит неоптимальный код.
Еще есть удобный и бесплатный инструмет для работы с linq запросами — linqpad (скачать можно здесь www.linqpad.net)
В общем я для себя вопрос апдейта решил следующим образом.
псевдокод:
public void Update(Entity entity)
{
using(MyDataContext dc = DataContextFactory.CreateInstance())
{
Entity original = dc.Entities.SingleOrDefault(c => c.Id == entity.Id);
ItemHelper.Clone(entity, original);
dc.SubmitChanges();
}
}
Фишка тут в методе Clone. Он с помощью рефлексии проходтся по всем полям первого объекта, помеченым атрибутом Column и копирует их значени во второй объект.
Для простых апдейтов работает замечательно
Клонирование не совсем эффективная техника.
Рефлекция.
Я бы советовал просто добавить в каждую таблицу добавить по колонке типа timestamp (MSSQL) и вам не придется с клонированием мучаться.
AlexS, привет
времени с публикации поста прошло немало, но надеюсь Вы эту тему еще не забросили, и сможете помочь в одном вопросе :)
Если сформулировать вкратце, то как сделать ObjectTrackingEnabled=false и SubmitChanges одновременно?
Т.е. если я извлекаю какие-то данные конструкцией select c, затем в другом приложении меняю эти данные, и читаю в исходном снова — они не меняются, LINQ соханяет их в текущий кэш.
Refresh объекта делать не всегда возможно (например, я удалил запись). Создавать каждый раз новый контекст — забить память (dispose не приводит к немедленному освобождению памяти).
А как Вы строите многопользовательские приложения?
10 Tips to improve Linq2Sql performance