Сначала я работаю с кодом EF 6.0.Я использую ObjectContext, чтобы определить, когда SaveChanges вызывается.В этом обработчике я пытаюсь установить пользовательские свойства объекта для некоторых конкретных значений.Все работает нормально, данные, измененные в обработчике, передаются в базу данных, но проблема в том, что измененный объект Entity возвращается в свое прежнее состояние после выполнения SaveChanges.
Вот некоторый код:
Во-первых, у меня есть базовый класс, который используется в качестве родителя во всех областях:
public class MyBaseEntity
{
public int UserID { get; set; }
}
В моем DbContext я подписан на событие SaveChanges:
void ObjectContext_SavingChanges(object sender, EventArgs e)
{
var context = sender as ObjectContext;
if (context != null)
{
context.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
.Foreach(p =>
{
// update the UserID with the current user ID that is provided
// through a construct for our DbContext
(p.Entity as MyBaseEntity).UserID = CurrentUserID
});
}
}
И теперь, когда я вызываю SaveChanges, происходит следующее:
var entity = new MyEntity();
entity.Name = "test";
// entity.UserID == 0 -> true
// before the save, entity.UserID will be 0 (default value)
context.SaveChanges();
// entity.UserID == 0 -> true
// after the save it will be again zero, although it was
// changed during ObjectContext.SaveChanges handler
// expected value would be entity.UserID = 102 (in case when global CurrentUserID is 102)
После вызова SaveChanges будет вызван обработчик события, и в базу данных будет вставлен правильный UserID, но после выполнения SaveChanges UserIDбудет возвращено к своему первоначальному значению.
Итак, это ошибка, или дизайн, и что такое обходной путь?