Я думаю, что нет способа получить идентификатор новой вставленной записи в событии SavingChanges
, так как событие просто вызывается до того, как база данных вообще коснется и будет создан идентификатор. К сожалению, нет события SavedChanges
, которое вызывается после сохранения данных.
Возможный вариант может использовать тот факт, что один из перегруженных SaveChanges
метода ObjectContext является virtual
(или overridable
в VB), а именно:
public virtual int SaveChanges(SaveOptions options)
(Примечание: Это виртуальное только в EF- , а не в более ранней версии! И только эта перегрузка является виртуальной, другие две перегрузки SaveChanges не являются!)
Таким образом, вы можете переопределить этот метод в ObjectContext вашей модели. В этом переопределенном методе вы вызываете SaveChanges базового класса, после чего ваши новые сущности должны иметь созданные идентификаторы из базы данных, которые вы могли бы зарегистрировать.
(Это просто грубая идея, я никогда не тестировал или не использовал эту виртуальную перегрузку. Я создал аналогичный механизм ведения журнала в SavingChanges, поскольку вы только что реализовали и имели ту же проблему. Но это было в EF 3.5, где это Виртуальный метод еще не существовал. Наконец, я зарегистрировал вставки только в важных местах после вызова SaveChanges, но это не было тогда «родовым», конечно. Возможно, новый виртуальный метод - хороший шанс улучшить это сейчас.)
Редактировать
немного более точного я имел в виду (в C# синтаксис):
public partial class MyEntitiesContext : ObjectContext
{
// ...
public override int SaveChanges(SaveOptions options)
{
// Log something BEFORE entities are stored in DB
int result = base.SaveChanges(options);
// Log something AFTER entities are stored in DB, especially new entities
// with auto-incrementing identity key which have been inserted in the DB
// should have the final primary key value now
return result;
}
// ...
}
Важно называть base.SaveChanges(options)
. (Вызов только SaveChanges(options)
без base.
заканчивается StackOverflow конечно.)
Hi Slauma, Спасибо за вашу помощь, не могли бы получить, что работать, это выглядит как SaveChanges (варианты SaveOptions) может быть вызвана без параметров вызов метода SaveChanges() (который мне нужно будет вызвать из моего переопределенного метода), потому что, когда я вызывал это из моего переопределенного метода SaveChanges (SaveOptions), это привело к StackOverflowExcpetion. Однако мне удалось переосмыслить, как это сделать, в итоге я написал свой собственный метод SaveAndLogChanges. –
@Julian: описанное вами StackOverflowException очень похоже на то, что вы не вызывали метод SaveChanges базового класса в своей переопределенной реализации. Я отредактировал свой ответ и добавил детали, чтобы подчеркнуть это. – Slauma
Hi Public Переопределяет Функция SaveChanges (ByVal параметры, как SaveOptions) As Integer Возврат MyBase.SaveChanges (опции) End Function –