У меня есть объект «Вопрос», который используются обеими объектами «QuestionSet» и «Survey». Логика заключается в создании набора вопросов, но при добавлении вопросов к опросу создайте клон, чтобы вопрос редактирования в вопросе не изменил вопрос в опросе. Однако, поскольку есть явная функциональность обновления, клон (в опросе) должен знать его происхождение (вопрос в вопросе).Ошибка при попытке ссылки на существующий объект при создании нового
Я решил это, добавил
public virtual Question CreatedFrom { get; set; }
в вопросе. Однако, когда я теперь сделать так в моем контроллере
oldQ = _questionRepository.GetById(qTransfer.Id);
q = new Question(oldQ);
q.CreatedFrom = oldQ;
q.Id = 0;
где копия конструктор Q делает полную копию значений вопроса (создание клона).
И, наконец, это в моем репо
if (item.Id == 0)
{
Add(item); //this calls Add on dbset
}
ActiveContext.SaveChanges();
Я получаю эту ошибку: Объект объект не может ссылаться несколько экземпляров IEntityChangeTracker.
Если я прошу прокомментировать q.CreatedFrom = oldQ; то я больше не получаю ошибку.
Я хочу просто ссылаться на родительские вопросы, когда создаю клон. Я все еще хочу, чтобы исходный вопрос работал независимо. Я мог бы, конечно, просто заменить CreatedFrom на CreatedFromId, но я подумал, что было бы неплохо с прямой ссылкой.
Update
Вот мой Клонирование код. При клонировании я копирую ссылку для CreateFrom, но это должно быть null в клонированном объекте.
public Question(Question q)
{
Id = q.Id;
Description = q.Description;
CreatedFrom = q.CreatedFrom;
Type = q.Type;
AddedTime = q.AddedTime;
DeletedTime = q.DeletedTime;
SortIndex = q.SortIndex;
IsPageBreak = q.IsPageBreak;
List<QuestionAlternative> list = new List<QuestionAlternative>();
QuestionAlternative alternative;
foreach (var alt in q.Alternatives)
{
alternative = new QuestionAlternative(alt);
alternative.Id = 0;
list.Add(alternative);
}
Alternatives = list;
}
QuestionAlternative в свою очередь, имеет конструктор копирования, как так:
public QuestionAlternative(QuestionAlternative qa)
{
Id = qa.Id;
Text = qa.Text;
HasTextAnswer = qa.HasTextAnswer;
}
Можете ли вы показать код клонирования внутри своего конструктора копирования? – Colin
К счастью, я обновил вопрос –