0

EF5、SQL Server 2012、および Web フロント エンドを使用しています。サーバーには、次の 2 つのクラスがあります。

public class Question
{
    public Question()
    {
        this.Answers = new List<Answer>();
    }
    public int QuestionId { get; set; }
    public string Title { get; set; }
    public string Answer { 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; }
}

フロントエンド アプリケーションへの質問を取得し、emptyAnswer を追加しました。

   var emptyAnswer = { "answerId"; null, "text": "xx", "questionId": formData.questionId};
   formData.answers.push(emptyAnswer);

次に、サーバーに PUT を実行し、サーバーに送信されたときに answerId が正しく null に設定されていることに気付きました。

    public HttpResponseMessage PutQuestion(int id, Question question)
    {
        var a = question;
    }

データは ASP.NET WebApi コントローラーによって受信されますが、質問の一部になっている新しく作成された回答オブジェクトを確認すると、 AnswerId は0です。

null > 0 から変更される理由を誰か教えてもらえますか? 問題は、更新を行うと、新しく作成された回答に AnswerId が設定されていないことを期待しているため、Entity Framework がエラーを返すことです。

ご注意ください。オブジェクトが Entity Framework に到達する前にチェックを行っています。私はそれを使用していると述べましたが、この時点では、poco クラスを確認しているだけなので、まだイメージに入っていないと思います。フィールドがnull不可であることについて、以下にいくつかの言及がありました。ただし、新しいオブジェクトを作成するときのペイロードは似ています。たとえば、「コンテンツ」オブジェクトを作成すると、フィールドが null に設定され、null のままになります。

これが、これまでの私のテストの結果です。すべてがもう少し明確になるように、フロントエンドをループから外しました。

作品:

var a = new Answer{
    Correct = false,
    Response = false,
    Text = "AA",
    Image = "DDD",
    QuestionId = question.QuestionId
};
question.Answers.Add(a);
_uow.Questions.Update(question);
_uow.Commit();

機能しません: 同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

var a = new Answer{
    AnswerId = 0,
    Correct = false,
    Response = false,
    Text = "AAA",
    Image = "DDD",
    QuestionId = question.QuestionId
};
var b = new Answer
{
    AnswerId = 0,
    Correct = false,
    Response = false,
    Text = "BBB",
    Image = "EEE",
    QuestionId = question.QuestionId
};

正しく動作しません。新しいエンティティ値は作成されません。1000 と 1001 を使用するだけです。

var a = new Answer{
    AnswerId = 1000,
    Correct = false,
    Response = false,
    Text = "AAA",
    Image = "DDD",
    QuestionId = question.QuestionId
};
var b = new Answer
{
    AnswerId = 1001,
    Correct = false,
    Response = false,
    Text = "BBB",
    Image = "EEE",
    QuestionId = question.QuestionId
};

動作しません: コンパイラ エラーです。null を int に変換できません

var a = new Answer{
    AnswerId = null,
    Correct = false,
    Response = false,
    Text = "AAA",
    Image = "DDD",
    QuestionId = question.QuestionId
};
var b = new Answer
{
    AnswerId = null,
    Correct = false,
    Response = false,
    Text = "BBB",
    Image = "EEE",
    QuestionId = question.QuestionId
};

機能しません: ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

var a = new Answer{
    Correct = false,
    Response = false,
    Text = "AAA",
    Image = "DDD",
    QuestionId = question.QuestionId
};
var b = new Answer
{
    Correct = false,
    Response = false,
    Text = "BBB",
    Image = "EEE",
    QuestionId = question.QuestionId
};
4

1 に答える 1

1

Answer の AnswerId プロパティが null 許容ではないためです。

public class Answer
{
    public int AnswerId { get; set; }
    public string Text { get; set; }
    public int QuestionId { get; set; }
    public virtual Question Question { get; set; }
}

また、EFは適切なIDを設定すると考えているようです。AnswerId が ID 列 (自動インクリメント ID) として構成されている場合、EF は文句を言いません。

于 2013-07-30T08:18:14.230 に答える