我有一个实体“Question”,实体“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,但我认为直接引用会很好。
更新
这是我的克隆代码。克隆时,我复制了 CreatedFrom 的引用,但是在被克隆的对象中应该为 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;
}