2016-11-01 7 views
1

私はWeb APIを少し試してみることにしました。私は通常のMVC 5プロジェクトをセットアップしました。これには、私が扱っているさまざまな種類のデータ用のモデルと通常の非Web APIコントローラがあります。挿入しようとすると、IEntityChangeTrackerエラーの複数のインスタンスでエンティティオブジェクトを参照できません。

これまでWeb APIをプロジェクトにインストールしています。ここで考えられるのは、Ajaxを使用して、ユーザーがボタンをクリックしたときに、設定したWeb APIコントローラーへのPOSTを通じてデータを送信することです。

私がここでやりたいことは、データを受信し、EF6を使用してSQLデータベースに保存することです。

ただし、私はこの質問のタイトルに間違いを続けています。私は周りを検索したし、はい、そこに答えがありますが、単に私はそれらを理解していないと私のコードにそれを動作させるために適用する方法を置く。

だから、いくつかのコード。これは、フォームと送信ボタンがある私の見解です。ユーザがこれをクリックすると、Ajaxリクエストが開始されます。この

public class ChatMessage 
{ 
    public int ChatMessageID { get; set; } 

    [Required(ErrorMessage = "A value has to be entered.")] 
    [StringLength(1000)] 
    [DisplayName("Message")] 
    public string ChatMessageText { get; set; } 

    [Required(ErrorMessage = "A value has to be entered.")] 
    [DataType(DataType.Date)] 
    [DisplayName("Chat message timestamp")] 
    public DateTime ChatMessageTime { get; set; } 

    [Required(ErrorMessage = "A value has to be entered.")] 
    public virtual ApplicationUser ChatMessageOwner { get; set; } 

    [Required(ErrorMessage = "A value has to be entered.")] 
    public virtual Grouppe Grouppe { get; set; } 
} 

は、だから私は、オブジェクトを作成するよう

var chatMessage = new Object(); 
chatMessage.ChatMessageOwner = "87b1e521-9c62-4d31-9cc7-a92b2b6b7db1"; 
chatMessage.ChatMessageText = "Test"; 
chatMessage.ChatMessageTime = 2016 - 11 - 01; 
chatMessage.Grouppe = 4; 


$.ajax({ 
    url: '/api/ChatMessages/post', 
    type: 'POST', 
    dataType: 'json', 
    data: chatMessage, 
    success: function (result) { 
     alert(result); 
    }, 
    error: function (err) { 
     alert(err.statusText); 
     console.log(err.statusText); 
    } 
}); 

のだから、最初は、私はこれらのメッセージを使用しているモデルが見え、その後、私は、WebアピコントローラIにAjaxのPOSTを介してこれを送ります使いたい意図したとおりにchatMessageオブジェクトをデバッグするときの方法は、この要求に応答すると、この

[Route("api/ChatMessages/post")] 
[ResponseType(typeof(ChatMessage))] 
public async Task<IHttpActionResult> PostChatMessage(ChatMessage chatMessage2) 
{ 
    ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 
    ChatMessage chatMessage = new ChatMessage(); 
    Grouppe grouppe = new Grouppe(); 
    grouppe.GrouppeID = 4; 

    chatMessage.ChatMessageOwner = user; 
    chatMessage.ChatMessageText = "Test"; 
    chatMessage.ChatMessageTime = DateTime.Now; 
    chatMessage.Grouppe.GrouppeID = grouppe.GrouppeID; 

    db.ChatMessage.Add(chatMessage); 
    await db.SaveChangesAsync(); 

    return CreatedAtRoute("DefaultApi", new { id = chatMessage.ChatMessageID }, chatMessage); 
} 

のように見えるgrouppeと「ユーザー」のためのオブジェクトを含む、読み込まれますように思われます。私はテキストと日付を意図した通りに取り出すこともできます(私はこれをいくつかのデバッグ - ダミーコードに置き換えました)。しかし、実際にデータベースに追加しようとしているdb.ChatMessage.Add(chatMessage)という行に到達すると、タイトルにエラーが表示されます。

私は何をすべきか分かりません。どのように複数のコンテキストなどを使用しているのかわかりません。

すべてのサポートは非​​常に高く評価されています。

+0

を? – CodeNotFound

+0

こんにちは!コントローラのクラス宣言の直後に私はこれを持っています: private ApplicationDbContext db = new ApplicationDbContext(); – KnoxCorsair

答えて

1

は、PostChatMessageアクションを実行したときに再インスタンス化されていないようです。

あなたはこれを行うことによって、問題を解決することができます:あなたはDbContextインスタンスを作成するにはどうすればよい

// Delete the db private field and use local variable. 
using (var db = new ApplicationDataContext()) 
{ 
    var user = db.Users.Find(System.Web.HttpContext.Current.User.Identity.GetUserId()); 
    ChatMessage chatMessage = new ChatMessage(); 
    Grouppe grouppe = new Grouppe(); 
    grouppe.GrouppeID = 4; 

    chatMessage.ChatMessageOwner = user; 
    chatMessage.ChatMessageText = "Test"; 
    chatMessage.ChatMessageTime = DateTime.Now; 
    chatMessage.Grouppe = grouppe; // Side note: here set the navigational property directly. 

    db.ChatMessage.Add(chatMessage); 
    await db.SaveChangesAsync(); 
} 
+0

それは働いている!手伝ってくれてありがとう! – KnoxCorsair

関連する問題