Linq to sql 如何将一个对象克隆(或复制)到另一个对象,但不要';不复制PK属性?

Linq to sql 如何将一个对象克隆(或复制)到另一个对象,但不要';不复制PK属性?,linq-to-sql,c#-3.0,clone,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属性 谢谢 您可以手动将新对象的属性设置为与旧对象相同 例如: Person p2 = new Person {

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

Person p1 = new Person();
p1.name = "John";
p1.sex = 'M';
Person p2 = new Person();
p2 = Util.Clone(p1);
问题是Person实体有一个标识PK“codPerson”,我不想复制这个PK。有没有办法克隆/复制一个对象,但不复制其PK属性


谢谢

您可以手动将新对象的属性设置为与旧对象相同

例如:

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

也许你可以考虑如下:

  • 确保Util.Clone(Person p)不会 复制codPerson属性
  • 清除克隆方法后的属性 被称为
  • 在初始化特定属性时创建新的Person对象

  • 在最基本的层面上,你不能——给定一个任意的对象o(这个问题意味着你在寻找通用的解决方案),你无法确定哪个字段是主键

    因此,您可以提高一个级别—通过添加一些约束,即您将通知您的工具主键字段是什么(或字段是什么),从而启用通用方法的使用

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

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

    除此之外,没有更多的细节,没有人能提出很多建议-啊,但是这个问题被标记为Linq to SQL(我错过了)ok

    Linq to SQL类中没有明显的帮助,也没有“表”,但快速查看.designer.cs中生成的代码可以发现,键字段具有类似于以下内容的注释(取自我必须掌握的一组类):

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


    因此,当您在类上进行反射以枚举要复制的属性时,您需要查找列和列中的“IsPrimaryKey”属性-不幸的是,如何执行此操作的详细信息超出了我的舒适区

    您可以使用.net反射

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

    但是SLaks,我不想手动复制。想象一下,如果它是一个具有100个属性的对象?!?!我已经测试了一些解决方案,但我需要知道如何判断属性是否是PKI如果您有一个具有100个属性的对象,您的代码或数据库中存在严重的设计问题。@Konamiman这是另一个相关的示例-您有10个表,其中有需要复制的行。每个表只有6个或7个属性,但是如果你把所有属性加在一起,那会很累人。但是如果我不知道哪些字段是PK呢?我知道我必须找到一个字段是否是PK,但我不知道如何做…正如我在回答中所说的-如果它是一个通用对象,人们如何知道PK是什么,这反过来又表明它不是一个通用对象,为了更有用,我们需要更多地了解该对象(你的代码不能确定哪个字段是主键,除非你告诉它哪个是主键。考虑默夫使用某种注释来识别PK:DUH-错过LINQ to SQL标签……去搜索关于使用反射的搜索……我怎么能不知道实体类型而使用它?它必须B。在克隆方法中(如果克隆方法在实用程序中是泛型的)。在我看来,在这一点上,您可能已经超出了尝试的范围。