Как я могу сохранить объект, который был возвращен из уже утилизированного DataContext? - PullRequest
0 голосов
/ 13 июля 2011

Получить пользовательское действие

[HttpGet]
[ActionName("Index")]
public ActionResult Get(int id)
{
    User u = UserCore.GetUser(id);

    if (u == null)
        return Content("user not found", "text/plain");

    return new XmlResult(u);
}

UserCore.GetUser

public static User GetUser(int UserID)
{
    using (PanamaDataContext db = new PanamaDataContext())
    {
        return (from u in db.Users where u.UserID == UserID select u).FirstOrDefault();
    }
}

Маршрут

routes.MapRoute(
    "GetUser",
    "user/{id}",
    new { controller = "Users", action = "Index" }
);

И, наконец, тестовые URL

/ user / 9000 возвращает «пользователь не найден», как и ожидалось (в настоящее время не существует)

/ пользователь / 75 (фактически существует в БД), однако возвращает:

Невозможно получить доступ к удаленному объекту. Имя объекта: 'DataContext доступен после утилизации. '.

[ObjectDisposedException: невозможно получить доступ к удаленному объекту. объект name: 'DataContext доступен после Dispose.'.]
System.Data.Linq.DataContext.GetTable (Type type) + 1020550
System.Data.Linq.CommonDataServices.GetDataMemberQuery (MetaDataMember член, выражение [] keyValues) + 120
System.Data.Linq.DeferredSourceFactory 1.ExecuteKeyQuery(Object[] keyValues) +258<br> System.Data.Linq.DeferredSourceFactory 1.Execute (экземпляр объекта) +928 System.Data.Linq.DeferredSource.GetEnumerator () + 53
System.Data.Linq.EntitySet 1.Load() +112<br> System.Data.Linq.EntitySet 1.get_Count () + 9
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterUser.Write14_User (String n, строка ns, пользователь o, логическое значение isNullable, логическое значение NeedType) + 5060
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterUser.Write15_User (Объект о) + 144

[InvalidOperationException: при создании XML произошла ошибка документ.]
System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Объект o, пространства имен XmlSerializerNamespaces, String encodingStyle, Идентификатор строки) + 646
System.Xml.Serialization.XmlSerializer.Serialize (TextWriter textWriter, Object o, пространства имен XmlSerializerNamespaces) + 72
System.Xml.Serialization.XmlSerializer.Serialize (TextWriter textWriter, объект o) +10 ...

Я предполагаю, что это потому, что указанный объект больше не существует, но что я могу сделать? Каким-то образом скопировать объект, возвращаемый из DataContext?

В любом случае он должен возвращать XML, а не эту ошибку.

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Вы должны использовать просмотр моделей.По сути, вы должны построить модель представления внутри времени жизни DataContext и передать эту модель представления в результат представления (в вашем случае XmlResult).Эта модель представления должна быть построена путем сопоставления свойств фактической модели предметной области, возвращаемой вашим текстовым контентом, и все это должно происходить в этом контексте времени жизни.У Айенде Рахиен есть замечательная серия сообщений в блоге о моделях представления (это для NHibernate, но проблема удаленного контекста точно такая же, как и с данными EF).

0 голосов
/ 13 июля 2011

Вы должны охотно включать дочерние строки, используя метод Include().

...