如何将对象克隆(或复制)到另一个对象,但不复制PK属性?

时间:2009-10-20 12:08:32

标签: linq-to-sql c#-3.0 clone

我正在尝试将所有对象属性复制到另一个对象,例如:

Person p1 = new Person();
p1.name = "John";
p1.sex = 'M';
Person p2 = new Person();
p2 = Util.Clone(p1);

问题是Person实体有一个身份PK'codPerson',我不想复制这个PK。有没有办法克隆/复制对象,但不要复制其PK属性??

感谢!!!

4 个答案:

答案 0 :(得分:1)

也许您可能会考虑以下事项:

  1. 确保Util.Clone(Person p)没有 复制codPerson属性
  2. 在克隆方法后清除属性 被称为
  3. 在专门初始化特定属性时创建一个新的Person对象。

答案 1 :(得分:1)

在最基本的层面上你不能 - 给定一个任意对象o(问题暗示你正在寻找通用解决方案)你无法确定哪个字段是主键。

所以你提升了一个级别 - 通过添加一些约束,即你将通知你的工具主键字段是什么(或字段是什么),因此可以使用泛型方法。

因此,您可以显式指定执行克隆的代码的PK字段(名称)(我假设您使用反射来避免显式复制所有字段)。您可以通过对要克隆的类使用某种类型的注释来识别PK,并使克隆代码排除具有相关注释的属性(注释意味着不会克隆该字段)。可能还有其他方法

你提到Linq - 你使用的是Linq的特定位吗?

除此之外,没有更多细节可以提出很多建议 - 啊但问题是用Linq to SQL标记的(我错过了)好吧......

在Linq to SQL类中没有任何明显的帮助 - 也没有“table”,但是快速查看.designer.cs中生成的代码表明关键字段的注释类似以下(取自我必须提供的一组课程):

[Column(Storage =“_ ID”,AutoSync = AutoSync.OnInsert,DbType =“Int NOT NULL IDENTITY”,IsPrimaryKey = true,IsDbGenerated = true)]

因此,当您在类上进行反射以枚举要复制的属性时,您将要在列中查找列和“IsPrimaryKey”属性 - 遗憾的是,如何执行此操作的详细信息有一定距离在我的舒适区之外!

答案 2 :(得分:0)

您可以手动将新对象的属性设置为等于旧对象。

例如:

Person p2 = new Person {
    Name = p1.Name,
    Gender = p1.Gender,
    //...
};

答案 3 :(得分:0)

你可以使用.net Reflection。

//using System.Reflection; 

var yourEntity = new Person {Name = "Green", Surname= "White"};
var cloneEntity = new Person();

 var allPi = typeof(Person).GetProperties();
 foreach (var pi in allPi)
 {
     if (pi.Name != "codPerson" && pi != null && pi.CanWrite)
         pi.SetValue(cloneEntity , pi.GetValue(yourEntity , null));
 }