簡體   English   中英

如何將新對象添加到現有實體,將數據放入數據中並讓EF將其添加到數據庫中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM