2010-10-22 3 views
1

Я хотел бы знать, когда сущности в определенной таблице базы данных создаются или обновляются. Приложение по существу является CMS, и мне нужно знать, когда будут внесены изменения в контент, чтобы я мог переиндексировать их для поиска.Обратные вызовы на сущности при создании/обновлении

Я знаю, что для автогенерируемого класса LINQ to EF существуют переопределяемые методы, когда некоторые поля изменяются, но мне нужно знать, когда создается или обновляется весь объект, а не только одно поле. Я попытался положить его в OnCreated, только чтобы найти, что означает OnObjectInitialized, а не OnObjectInsertedIntoDBTable xD

Я сделал несколько поисков и наткнулся на this link. Раздел «Entity State» выглядит так, как я хочу, но я не уверен, как использовать эту информацию. Где я могу переопределить эти методы?

Или, может быть, есть другой/лучший способ?

(Мне также нужно знать это для другой части системы, которая будет отправлять уведомления при изменении определенного содержимого. Я бы предпочел, чтобы этот код выполнялся автоматически, когда вставка/обновление происходит вместо того, чтобы помещать его в контроллер и надеясь, что я всегда буду называть этот метод.)

ответ

2

Вам нужно получить ObjectStateEntry (ы) из свойства ObjectStateManager объекта ObjectContect.

var objectStateEntries = this.ObjectStateManager.GetObjectStateEntries(); 

Эти записи содержат каждое состояние объекта, которое вы вытащили за контекст, и какие действия выполнялись над ними.

Если вы используете EF4, вы можете переопределить метод SaveChanges, чтобы включить эту функцию. Я использовал эту технику для проверки каждого изменения, которое происходит в базе данных вместо триггеров.

+0

Я все еще потерял: -/Я не совсем понимаю EF, если честно, и я использую ASP.NET MVC 2 (.NET 4), поэтому я считаю, что все это создано для меня через .dbml designer (создает класс, который наследует System.Data.Linq.DataContext). Я путаю EF с чем-то другим или, возможно, просто смотрю в неправильные места? –

+0

@Colin O'Dell - Существует 4 разных стратегии генерации, поэтому никогда не гарантируется, что любой из сгенерированных кодов будет иметь эти крючки. В принципе, у каждого ORM есть определенная концепция отслеживания состояния внутри него. Объект сбрасывается, и ссылка (sorta) сохраняется. Объектный объект EF ObjectContext обеспечивает отслеживание состояния. Это то, что вам нужно отслеживать, когда сущности создаются и обновляются. – jfar

+0

OK спасибо. Я знаю, что я могу вытащить сущность из контекста данных, изменить ее и вызвать Save() в контексте данных, который точно знает, что было изменено. Я буду копать немного глубже и посмотреть, что я могу найти. Спасибо еще раз за помощь! –

Смежные вопросы