流畅的hibernate复制一个完整的实体
本文关键字:一个 实体 hibernate 复制 | 更新日期: 2023-09-27 18:18:26
如何最好地复制一个实体实例在fluent nhibernate 3.3.1;我从数据库中读取一个对象,得到一个对象,现在我改变这个对象的一些值。
我试图将Id设置为0,这不起作用,我还在我的Entityclass中编写了一个克隆方法。这是我的方法。
public class Entity: ICloneable
{
public virtual int Id { get; protected set; }
object ICloneable.Clone()
{
return this.Clone();
}
public virtual Entity Clone()
{
return (Entity)this.MemberwiseClone();
}
}
你能给我一些建议吗
如果你的对象是不可序列化的,你只是在寻找一个快速的一对一的副本,你可以很容易地使用AutoMapper:
// define a one-to-one map
// .ForMember(x => x.ID, x => x.Ignore()) will copy the object, but reset the ID
AutoMapper.Mapper.CreateMap<MyObject, MyObject>().ForMember(x => x.ID, x => x.Ignore());
然后当你复制方法时:
// perform the copy
var copy = AutoMapper.Mapper.Map<MyObject, MyObject>(original);
/* make copy updates here */
// evicts everything from the current NHibernate session
mySession.Clear();
// saves the entity
mySession.Save(copy); // mySession.Merge(copy); can also work, depending on the situation
我为我自己的项目选择了这种方法,因为我有很多关于记录复制的奇怪需求的关系,我觉得这给了我更多的控制。当然,在我的项目中实际的实现略有不同,但基本结构几乎遵循上述模式。
请记住,Mapper.CreateMap<TSource, TDestination>()
在内存中创建了一个静态映射,因此只需要定义一次。对于相同的TSource
和TDestination
再次调用CreateMap
将覆盖已经定义的映射。同样,调用Mapper.Reset()
将清除所有的映射。
你需要
- 装载NH
- 使用如下方法克隆实体,并创建副本
- 驱逐主体
- 复制
- 更新副本,不引用任何主体
克隆方法如下
/// <summary>
/// Clone an object without any references of nhibernate
/// </summary>
public static object Copy<T>(this object obj)
{
var isNotSerializable = !typeof(T).IsSerializable;
if (isNotSerializable)
throw new ArgumentException("The type must be serializable.", "source");
var sourceIsNull = ReferenceEquals(obj, null);
if (sourceIsNull)
return default(T);
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
你可以这样调用它
object main;
var copy = main.Copy<object>();
要查看其他关于使用什么方法的意见,您也可以查看此链接。复制对象到对象(使用Automapper ?)