Я нашел следующий код, который должен клонировать сущность. В моем случае у меня есть таблица для человека, и есть несколько вертикалей для телефонных номеров, электронных писем и т. Д. Когда я пытаюсь клонировать сущность человека, код работает нормально. Однако, когда я пытаюсь добавить объект в свою таблицу, я получаю следующую ошибку.
"Не удалось добавить или присоединить объект, поскольку его 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;
}