Entity Framework вопрос, касающийся времени сохранения - PullRequest
0 голосов
/ 28 мая 2011

У меня есть объект, который имеет ObjectContext.OnSave этого объекта Я выполняю действие, используя этот ObjectContext, например:

public void SaveChangesAction(ObjectContext context)
        {
            // Validate the state of each entity in the context
            // before SaveChanges can succeed.
            foreach (ObjectStateEntry entry in
                context.ObjectStateManager.GetObjectStateEntries(
                EntityState.Added | EntityState.Modified))
            {
                var type = entry.Entity.GetType();
                var RepoBase = typeof(RepositoryBase<myEntityFrameworkObject>);
                MethodInfo mi = RepoBase.GetMethod("GenerateLog");
                MethodInfo constructed = mi.MakeGenericMethod(type);

                constructed.Invoke(this, new object[] { entry.Entity });
            }
        }

Внутри моего метода GenerateLog я беру свой Entity и отсоединяю его от ObjectContext (чтобы его можно было превратить вДвоичный объект без прохождения всех объектов Lazy Loaded).

После превращения в двоичный объект я создаю еще один объект (другого типа), который содержит двоичные данные.Я звоню this.ObjectContext.AddObject('TableName', myNewObject);.

Затем я вызываю это на своем ранее отсоединенном объекте (entityState - предыдущее состояние сущности):

if (entity.EntityState != entityState)
{
    this.ObjectContext.AddObject(entity.GetType().Name, entity);
}

На этом этапе код возвращается к методу SaveChangesAction сверху.,Ни один из этих объектов не находится в моем ObjectContext сейчас, и поэтому ни один из них не сохраняется в моей базе данных.
Я понимаю, что я уже делаю что-то плохое, изменяя объекты внутри ForEach, который влияет на них, но я понятия не имею, как еще сделатьучитывая то, что это код, который мне нужно запустить прямо перед сохранением моего ObjectContext.

1 Ответ

1 голос
/ 28 мая 2011

Несколько баллов:

  • Это отражение пахнет.Вы знаете, что у вас есть репозитории, поэтому просто создайте словарь с типом в качестве значения для поиска.
  • Интересно, как это возможно, что ваш код даже работает.Если вы отсоедините сущность внутри цикла, она должна изменить итеративную коллекцию и выдать исключение.Этого можно избежать, вызвав ToArray или ToList в запросе менеджера состояний.
  • Вы перебираете добавленные и измененные сущности и отсоединяете их, но после этого вы всегда добавляете сущность как новую, вместо того, чтобы обновлять старуюобъект, который вы пытаетесь вставить дубликат
  • Отсоединение объекта нарушит все отношения.Я почти уверен, что некоторые изменения в отношениях будут потеряны этим действием, и добавление или присоединение объекта к контексту не создаст их заново.
  • Метод принимает ObjectContext в качестве параметра, но другие ваши фрагменты кода используютthis.ObjectContext поэтому совершенно неясно, как эти части связаны между собой
  • Нет context.SaveChanges, поэтому, если вы не вызываете его в другом месте, это причина того, что никакие изменения не сохраняются
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...