流畅的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();
    }
}

你能给我一些建议吗

流畅的hibernate复制一个完整的实体

如果你的对象是不可序列化的,你只是在寻找一个快速的一对一的副本,你可以很容易地使用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>()在内存中创建了一个静态映射,因此只需要定义一次。对于相同的TSourceTDestination再次调用CreateMap将覆盖已经定义的映射。同样,调用Mapper.Reset()将清除所有的映射。

你需要

  1. 装载NH
  2. 使用如下方法克隆实体,并创建副本
  3. 驱逐主体
  4. 复制
  5. 更新副本,不引用任何主体

克隆方法如下

         /// <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 ?)