![](/img/trans.png)
[英]How can i add a table in my existing database without losing data in Entity-framework Code first 5.0 ?
[英]How can I add a new object to an existing Entity, PUT the data and have EF add it to my database?
我正在使用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; }
}
我在前端應用程序中檢索了一個問題,並添加了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設置。
請注意。 我在對象到達實體框架之前進行檢查。 我說過我正在使用它,但是目前我還沒有考慮到它,因為我只是檢查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
};
這是因為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不會抱怨。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.