我有一个问题,我已经尝试解决了一段时间。
方案如下
此人将在数据库中插入新实体。
要开始插入,我需要从xml文件进行代价高昂的转换以填充一些基本属性。
我想在之前处理这个xml,并将已经转换为o对象的对象存储在一些简短的缓存中。
之后,填充此对象的其他属性的过程非常耗时,我希望此人可以在中间停止并在之后返回结束。但是由于在插入此对象时在数据库中进行了一些验证,我无法将此对象保存在数据库中。
我已经整理过的解决方案涉及在人停止填充对象时序列化对象,即使它还没有完成,也就是当人回来继续填充时,我会反序列化对象以便人可以继续。
问题是,当我尝试序列化这个对象时,由于延迟加载,nihibernate几乎整个数据库序列化,并且我得到stackoverlow错误(大声笑,这很有趣,这里说这个错误大声笑)。
有谁知道我应该做什么?
我所做的一件事就是将对象保留在缓存中(不知道/ net 4缓存如何序列化它但接缝工作)然而每次我检索对象时它都会丢失一半的子对象,并且总是只有一半的孩子......
如果是现场我有一个包含20个项目的订单如果我试图从缓存中取回它将返回10个项目如果我再次尝试检索它我会得到订单只有5个itens。
有谁知道如何解决这个问题?
已经在那里尝试
答案 0 :(得分:1)
一种方法是首先预测您想要的内容,然后将结果序列化为DTO。
然而,通过这样做,您会遇到一个问题,即您正在创建具有大量setter / getter的DTO。创建一个简单的匿名类型并将其序列化不是更容易吗?我写了blog post来解释这一点。
//first create our anonymous type DTO
var dto = new {
Id = 0L,
Source = string.Empty,
Destination = string.Empty,
Is301 = false
};
//notice the ListAs(dto) extension method
var model = Session.QueryOver<CmsRedirect>()
.SelectList(s => s
.Select(x => x.Id).WithAlias(() => dto.Id)
.Select(x => x.Source).WithAlias(() => dto.Source)
.Select(x => x.Destination).WithAlias(() => dto.Destination)
.Select(x => x.Do301).WithAlias(() => dto.Is301)
)
.Take(take).Skip(page * pageSize)
.ListAs(dto);
return Json(new { Total = total, List = model },
JsonRequestBehavior.AllowGet);
ListAs是一种简单的(ish)扩展方法。 (功劳归菲利普金斯基)
public static class NHibernateExtensions {
public static IList<TRes> ListAs<TRes>(
this IQueryOver qry, TRes resultByExample) {
var ctor = typeof(TRes).GetConstructors().First();
return qry.UnderlyingCriteria
.SetResultTransformer(
Transformers.AliasToBeanConstructor(
(ConstructorInfo) ctor)
).List<TRes>();
}
}
但是在我的示例中警告我不会将子集合序列化,因此您可能需要自己手动处理。