エンティティ「QuestionSet」と「Survey」の両方で使用されるエンティティ「Question」があります。ロジックは、一連の質問を作成することですが、質問を調査に追加するときにクローンを作成して、質問セットの質問を編集しても調査の質問が変更されないようにします。ただし、明示的な更新機能があるため、クローン (調査中) はその起源 (質問セットの質問) を知る必要があります。
を追加してこれを解決しました
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;
}