Проблема редактирования клонированного / отдельного объекта в WPF - что является стандартом? - PullRequest
1 голос
/ 05 октября 2010

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

Чтобы пользователь не мог работать с одним и тем же связанным объектом (это вызывает визуальное изменение каждого связанного элемента управления в одно и то же время), я хочу использовать некоторые функциональные возможности, клонировать объект, а затем отсоединить оригинал, прикрепить клонированный объект. и сохраните его в базе данных. Проблема в том, что клонированный объект не сохраняется должным образом в базе данных. Если я пытаюсь только отсоединить объект, отредактируйте, а затем присоедините - при отсоединении он теряет все родительские и дочерние ссылки ...

Что такое стандарт CRUD в WPF? Как правильно отредактировать текущую строку, сохраняя ее в коллекции ObservableCollection?

Пожалуйста, помогите ....

Оран

1 Ответ

1 голос
/ 05 октября 2010

Ну, похоже, я нашел прекрасное решение.

  1. Сначала реализуйте свой клонируемый контейнер объектов:

    public class ClonableObjectContainer : Object , ICloneable
    {
        private Object data;
    
        public ClonableObjectContainer(Object obj)
        {
            data = obj;
        }
    
        public Object Data
        {
            get { return data; }
        }
    
        public object Clone()
        {
            return (ClonableObjectContainer)this.MemberwiseClone();
        }
    }
    
  2. Затем используйте этот объект с его методом Clone для создания вашего отдельного объекта редактирования:

             ClonableObjectContainer coc = new ClonableObjectContainer(actor);
             EntityObject editEntity = (EntityObject)coc.Data;
    
  3. После внесения изменений отсоедините исходный объект от ObjectContext , прикрепите клонированный объект, измените его состояние на EntityState.Modified и изящно сохраните:

            ContextManager.CurrentObjectContext.Detach(oldItem);
            ContextManager.CurrentObjectContext.Attach((IEntityWithKey)item);
            ContextManager.CurrentObjectContext.ObjectStateManager.ChangeObjectState(item, EntityState.Modified); 
            ContextManager.Save();
    

Надеюсь, это поможет ... Оран

РЕДАКТИРОВАТЬ: Если следующее не работает для вас, пожалуйста, проверьте продолжение обсуждения: Entity Framework Присоединение исключения после клонирования

...