0

我正在使用 EF5、SQL Server 2012 和 Web 前端。在服务器上,我有以下两个类:

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; }
}

我在前端应用程序中检索了一个问题,添加了一个空答案:

   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。

请注意。我在对象到达实体框架之前进行检查。我提到我正在使用它,但此时我认为它还没有出现,因为我只是检查了 poco 类。下面提到了该字段不可为空。但是,当我创建一个新对象时,有效负载是相似的,例如,当我创建一个“内容”对象时,我将字段设置为 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 属性不可为空

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),则 EF 不会抱怨。

于 2013-07-30T08:18:14.230 回答