Я думаю, что нет никакого способа получить идентификатор новой вставленной записи в событии SavingChanges
, поскольку событие просто вызывается до того, как база данных вообще будет затронута и создан идентификатор. К сожалению, нет события SavedChanges
, которое вызывается после сохранения данных.
Возможным вариантом может быть использование того факта, что одной из перегрузок метода SaveChanges
ObjectContext является virtual
(или overridable
в VB), а именно:
public virtual int SaveChanges(SaveOptions options)
(Примечание: виртуальная только в EF 4, а не в более ранней версии! И только эта перегрузка является виртуальной, две другие перегрузки SaveChanges — нет!)
Таким образом, вы можете переопределить этот метод в ObjectContext вашей модели. В этом переопределенном методе вы вызываете SaveChanges базового класса, и после этого ваши новые объекты должны иметь созданные идентификаторы из базы данных, которые вы затем можете регистрировать.
(Это просто грубая идея, я никогда не тестировал и не использовал эту виртуальную перегрузку. Я создал аналогичный механизм ведения журнала в SavingChanges, который вы только реализуете, и у меня была та же проблема. Но это было в EF 3.5, где этот виртуальный метод не пока не существует. Наконец, после вызова SaveChanges я зарегистрировал вставки только в важных местах, но тогда это, конечно, не было «универсальным». Возможно, новый виртуальный метод - хороший шанс улучшить это сейчас.)
Изменить
Немного точнее, что я имел в виду (в синтаксисе С#):
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.)
person
Slauma
schedule
21.07.2010