【问题标题】:Clone (deep copy) Entity LINQ克隆(深拷贝)实体 LINQ
【发布时间】:2010-11-30 20:33:18
【问题描述】:

我想深度复制一个实体,我正在寻找最好的方法。我也很关心表演。

我计划让我的所有实体实现 ICloneable,其中 Clone() 基本上将卷影复制并克隆所有引用。

例如:

[DataContract()]    
class MyEntity {
    public int id;  
    public string name;     
    public EntitySet<AnotherEntity> myOtherEntity;
}

MyEntity Clone() {
 Entity ent = new Entity(); 
 ent.name = this.name;
 ent.myOtherEntity = this.myOtherEntity.Clone();
 return ent;
}

这是一个好方法吗?或者我应该使用 linq 加载实体,删除所有主键(将 id 设置为 0),然后使用 Create(entity) 函数复制它?反射也可以是一个有效的解决方案(不太慢)吗?在更新我的实体类(例如新成员)而不更新克隆函数时,至少反射可以避免这个问题......

【问题讨论】:

    标签: .net linq clone


    【解决方案1】:

    你可以试试这个功能:

        private static object CloneObject(object obj)
        {
            Type cloneType = obj.GetType();
    
            object clone = Activator.CreateInstance(cloneType);
    
            PropertyInfo[] properties = cloneType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty);
            foreach (PropertyInfo property in properties)
            {
                if (property.CanWrite)
                {
                    object value = property.GetValue(obj, null);
                    property.SetValue(clone, value, null);
                }
            }
    
            return clone;
        }
    

    Entity newEnt = new Entity();
    newEnt = (Entity)CloneObject(oldEnt);
    

    【讨论】:

      【解决方案2】:

      ICloneable 不是一个糟糕的解决方案;毕竟,它就是为此目的而设计的。我不确定是否要为每种实体类型编写一个实现,但您可以使用代码生成器来解决这个问题。但是,请注意循环引用。但是,如果您在执行此操作时完全关心性能,那么您可能过于频繁地这样做了。如果这里的性能是一个问题,我想知道您实际上要解决什么问题。

      【讨论】:

      • 我想为它编写一个代码生成器可能是一个不错的解决方案,至少与团队中的其他开发人员相比更稳定。
      • 使用 EF v4,您可以使用自定义 T4 工件生成模板来执行此操作,作为模型生成的一部分。
      • 我来看看。谢谢你:)
      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多