代码之家  ›  专栏  ›  技术社区  ›  geoff swartz

使用实体框架4克隆对象

  •  2
  • geoff swartz  · 技术社区  · 14 年前

    我找到了下面的代码,它应该克隆一个实体。在我的例子中,我为一个人准备了一个表格,并且有多个垂直线用于电话号码、电子邮件等。当我尝试克隆一个个人实体时,代码似乎可以正常工作。但是,当我试图将对象添加到我的表中时,会出现以下错误。

    “无法添加或附加对象,因为其EntityReference的EntityKey属性值与此对象的EntityKey不匹配。”

    我不太确定要改变什么才能使这项工作发挥作用。

    private static T DataContractSerialization<T>(T obj)
            {
                DataContractSerializer dcSer = new DataContractSerializer(obj.GetType());
                MemoryStream memoryStream = new MemoryStream();
    
                dcSer.WriteObject(memoryStream, obj);
                memoryStream.Position = 0;
    
                T newObject = (T)dcSer.ReadObject(memoryStream);
                return newObject;
            }
    

    以下是我使用代码的方式。

    public static void CopyData(int sourcecompanyid)
            {
                var rUtil = new CREntities();
                rUtil.Connection.Open();
    
                using (var r = new CREntities())
                {
    
                    var candidates = r.Candidates.Include("Phones").Include("Emails").Where(c => c.companyId == sourcecompanyid);
    
                    foreach (var candidate in candidates)
                    {
                        ObjectParameter newcandid = new ObjectParameter("newcandid", typeof(string));
    
                        Candidate newcand = DataContractSerialization<Candidate>(candidate);
    
                        rUtil.GetNextCandId(newcandid);
    
                        newcand.CandID = newcandid.Value.ToString();
    
                        foreach (var phone in newcand.Phones)
                            phone.CandID = newcand.CandID;
    
                        foreach (var email in newcand.Emails)
                            email.CandID = newcand.CandID;
    
                        rUtil.Candidates.AddObject(newcand);
                        rUtil.SaveChanges();
                    }
                }
                rUtil.Connection.Close();
                rUtil.Dispose();
            }
    
            private static T DataContractSerialization<T>(T obj)
            {
                DataContractSerializer dcSer = new DataContractSerializer(obj.GetType());
                MemoryStream memoryStream = new MemoryStream();
    
                dcSer.WriteObject(memoryStream, obj);
                memoryStream.Position = 0;
    
                T newObject = (T)dcSer.ReadObject(memoryStream);
                return newObject;
            }
    
    1 回复  |  直到 13 年前
        1
  •  0
  •   Mas    13 年前

    克隆对象时,EntityKey属性可能仍处于设置状态。克隆后,尝试直接设置newcand.entitykey=null。