клонирование объекта с помощью структуры лица 4 - PullRequest
2 голосов
/ 09 ноября 2010

Я нашел следующий код, который должен клонировать сущность. В моем случае у меня есть таблица для человека, и есть несколько вертикалей для телефонных номеров, электронных писем и т. Д. Когда я пытаюсь клонировать сущность человека, код работает нормально. Однако, когда я пытаюсь добавить объект в свою таблицу, я получаю следующую ошибку.

"Не удалось добавить или присоединить объект, поскольку его 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 Ответ

0 голосов
/ 06 июня 2011

Когда вы клонируете объект, свойство EntityKey, вероятно, все еще установлено. Попробуйте установить newcand.EntityKey = null сразу после клонирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...