3

如何在 fluent nhibernate 3.3.1 中最好地复制实体实例;我从数据库中读取了一个对象,我得到了一个对象,现在我更改了这个对象的一些值。我要保存这个几乎没有变化的对象。

我试图将 Id 设置为 0,这不起作用,我也在我的 Entityclass 中编写了一个 Clone 方法。这是我的方法。

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

你给我一些提示。

4

2 回答 2

2

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

于 2013-06-13T12:43:02.873 回答
1

你需要

  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>();

要查看有关使用什么的其他意见,您也可以查看此链接Copy object to object(使用 Automapper ?)

于 2013-06-13T12:17:48.637 回答