次の 2 つのクラスで EF5 と SQL Server 2012 を使用しています。
public class Question
{
public Question()
{
this.Answers = new List<Answer>();
}
public int QuestionId { get; set; }
public string Title { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
public class Answer
{
public int AnswerId { get; set; }
public string Text { get; set; }
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
}
マッピングは次のとおりです。
public class AnswerMap : EntityTypeConfiguration<Answer>
{
public AnswerMap()
{
// Primary Key
this.HasKey(t => t.AnswerId);
// Identity
this.Property(t => t.AnswerId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
データベース DDL
CREATE TABLE Answer (
[AnswerId] INT IDENTITY (1, 1) NOT NULL,
[QuestionId] INT NOT NULL,
[Text] NVARCHAR(1000),
CONSTRAINT [PK_Answer] PRIMARY KEY CLUSTERED ([AnswerId] ASC)
)";
ここに私が試した結果があります:
これは 1 人の子供に有効です。
var a = new Answer{
Text = "AA",
QuestionId = 14
};
question.Answers.Add(a);
_uow.Questions.Update(question);
_uow.Commit();
これは複数の子には機能しません:
エラー: 同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。
var a = new Answer{
AnswerId = 0,
Text = "AAA",
QuestionId = 14
};
var b = new Answer {
AnswerId = 0,
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
これは複数の子には機能しません:
AnswerID の 1000 と 1001 を作成しますが、データベースによって新しい ID を作成したいと考えています。
var a = new Answer{
AnswerId = 1000,
Text = "AAA",
QuestionId = 14
};
var b = new Answer {
AnswerId = 1001,
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
動作しません:
コンパイラ エラー。null を int に変換できません
var a = new Answer{
AnswerId = null,
Text = "AAA",
QuestionId = 14
};
var b = new Answer
{
AnswerId = null,
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
動作しません:
ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。
var a = new Answer{
Text = "AAA",
QuestionId = 14
};
var b = new Answer
{
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
私のアプリケーションでは、クライアントで生成された 1 つ以上の新しい Answer オブジェクトがあり、これらはサーバーに送信されます。上記では、クライアントを質問に追加せずに何が起こるかをシミュレートしています。Question オブジェクトへのすべての回答の追加はクライアントで行われ、JSON 文字列でサーバーに送信されることに注意してください。次に、次のように Question オブジェクトにデシリアライズされます。
public HttpResponseMessage PutQuestion(int id, Question question) {
_uow.Questions.Update(question);
_uow.Commit();
各 Answer オブジェクトを で作成し、new identity ID
これらを Question オブジェクトに追加して、Question オブジェクトを通常の方法で返すようにしたいと考えています。
どうすればこれができるのかわかりません。これまでのすべての簡単なテストは機能しません。これは、グループメンバーによる以前の質問のバリエーションであり、明確ではなく、私が締めくくろうとしていることに注意してください. この質問は、もっと明確になることを願っています。
ノート:
update をコーディングする方法は次のとおりです。
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
DbSet.Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}