Я думаю, что нет способа получить идентификатор новой вставленной записи в событии SavingChanges
, так как событие просто вызывается до того, как база данных вообще будет затронута, и идентификатор будет создан. К сожалению, нет события SavedChanges
, которое вызывается после сохранения данных.
Возможным вариантом может быть использование факта, что одна из перегрузок метода ObjectContext SaveChanges
равна virtual
(или overridable
в VB), а именно:
public virtual int SaveChanges(SaveOptions options)
(Примечание: это виртуально только в EF 4, а не в более ранней версии! И только эта перегрузка является виртуальной, две другие перегрузки 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.)