0

我有一个实体“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;
    }
4

1 回答 1

2

我认为你的问题在这里:

“在克隆时,我复制了 CreatedFrom 的引用,但是在被克隆的对象中应该为空”

oldQ.CreatedFrom在调用构造函数时,引用的值可能为 null,但它仍然是引用类型。因此,当您调用q.CreatedFrom = oldQthen时oldQ.CreatedFrom,也将其设置为相同的引用 - 即它将引用自身。

如果您将 CreatedFromID 添加为问题上的属性并改用它,那么我认为 Entity Framework 将为您修复您的引用。所以属性应该是这样的:

public int? CreatedFromID { get; set; }

[ForeignKey("CreatedFromID ")]
public virtual Question CreatedFrom { get; set; }

在你的构造函数中:

public Question(Question q)
{
   //Stop setting the reference property
   //CreatedFrom = q.CreatedFrom;

   //Set the foreign key instead        
   CreatedFromID = q.CreatedFromID;

   //EDIT - as discussed in the comments it would make more sense like:
   //CreatedFromID = q.ID;

}

这值得一读保存悲伤并使用该外键

编辑

您不必添加外键来解决此问题。如果您首先将引用设置为逻辑正确的事物,那么这也应该解决它。

public Question(Question q)
{
    Id = 0;
    CreatedFrom = q;
}
于 2013-09-24T10:04:00.073 回答