Обновить отношения при сохранении изменений в объектах EF4 POCO

Entity Framework 4, объекты POCO и ASP.Net MVC2. У меня много отношений, скажем, между объектами BlogPost и Tag. Это означает, что в моем сгенерированном T4 классе POCO BlogPost у меня есть:

public virtual ICollection Tags {
    // getter and setter with the magic FixupCollection
}
private ICollection _tags;

Я запрашиваю BlogPost и связанные теги из экземпляра ObjectContext и отправляю его на другой уровень (просмотр в приложении MVC). Позже я возвращаю обновленный BlogPost с измененными свойствами и измененными отношениями. Например, у него были теги «A», «B» и «C», а новые теги - «C» и «D». В моем конкретном примере нет новых тегов, и свойства тегов никогда не меняются, поэтому единственное, что следует сохранить, - это измененные отношения. Теперь мне нужно сохранить это в другом ObjectContext. (Обновление: теперь я попытался сделать это в том же экземпляре контекста, но тоже потерпел неудачу.)

Проблема: я не могу заставить его правильно сохранять отношения. Я перепробовал все, что нашел:

  • Controller.UpdateModel и Controller.TryUpdateModel не работают.
  • Получение старого BlogPost из контекста, а затем изменение коллекции не работает. (с другими методами из следующего пункта)
  • Этот , вероятно, сработает, но я надеюсь, что это всего лишь обходной путь, а не решение: (.
  • Пробовали функции Attach / Add / ChangeObjectState для BlogPost и / или Теги во всех возможных комбинациях. Ошибка.
  • Это похоже на то, что мне нужно, но оно не работает (я пытался исправить это, но не могу решить свою проблему).
  • Пробовал ChangeState / Add / Attach / ... объекты отношений контекста. Ошибка.

"Не работает" в большинстве случаев означает, что я работал над данным "решением", пока оно не выдает ошибок и не сохраняет по крайней мере свойства BlogPost . Что происходит с отношениями, различается: обычно теги снова добавляются в таблицу тегов с новыми PK, и сохраненный BlogPost ссылается на них, а не на исходные. Конечно, у возвращенных тегов есть PK, и перед методами сохранения / обновления я проверяю PK, и они равны тем, что есть в базе данных, поэтому, вероятно, EF думает, что это новые объекты, а эти PK являются временными.

A проблема, о которой я знаю, и может сделать невозможным найти автоматизированное простое решение: когда коллекция объекта POCO изменяется, это должно происходить с помощью вышеупомянутого свойства виртуальной коллекции, потому что тогда трюк FixupCollection обновит обратные ссылки на другом конце отношения "многие ко многим". Однако, когда View «возвращает» обновленный объект BlogPost, этого не произошло. который компилируется и используется в качестве предиката для вызова LINQ-to-SQL Where (). Проблема в том, что я пытаюсь сравнить Enum (с int в качестве его ...

Я пытаюсь динамически построить дерево выражений на C #, которое компилируется и используется в качестве предиката для LINQ-to-SQL Where ( ). Проблема в том, что я пытаюсь сравнить Enum (с int в качестве базового типа) напрямую с Int, но это не дает результата с ошибкой «Член MyEnumType не поддерживает преобразование в SQL».

Код :

ParameterExpression param = Expression.Parameter(typeof(MyClass), "obj"); //input parameter - this exposes a property of the Enum type
MemberExpression enumMember = Expression.Property(param, "MyEnumProperty"); //used to get the Enum typed property from the parameter

//MISSING STEP TO CAST THE ENUM OF THE MEMBER EXPRESSION TO AN INT?

BinaryExpression binaryExpr = Expression.Equal(enumMember, Expression.Constant(1));
LambdaExpression> whereClause = Expression.Lambda(binaryExpr, param);

//when whereClause is used to filter LINQ-to-SQL results, the error is thrown

Я новичок в деревьях выражений и не могу этого понять. Я пробовал использовать

Expression.Convert(enumMember, typeof(int))

в качестве первой части BinaryExpression, но это не помогло.

Любая помощь - это очень много. оценен.

10
задан Lee D 3 September 2010 в 11:02
поделиться