【发布时间】:2013-07-30 07:39:41
【问题描述】:
我正在使用 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
};
【问题讨论】:
-
在您的数据库中,ID 是 1 索引的(即从 1,2,3 与 0,1,2 开始),因此无论如何您都无法输入零索引。
-
这取决于列是否配置为标识。如果该列不是标识列,则 0 是一个完全有效的值。
-
我正在检查对象并注意到它在到达 EF 之前为 0,而它只是一个 poco 类。
标签: c# asp.net-mvc json entity-framework asp.net-mvc-4