2016-11-01 2 views
1

Я начал немного экспериментировать с веб-API и стараюсь заставить его работать. У меня есть обычный проект MVC 5, в котором у меня есть модели для разных типов данных, которые я обрабатываю, а также обычные, то есть не-API-интерфейсы API.Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker при попытке вставить

Теперь, что я сделал, это установить Web API в проект. Мысль здесь заключается в использовании Ajax, отправке данных, когда пользователь нажимает кнопку, через POST для контроллера веб-API, который я настроил.

Что я хочу здесь сделать, так это получить данные и с помощью EF6 сохранить его в базе данных SQL.

Однако. Я продолжаю получать ошибку в названии этого вопроса. Я обыскал и да, есть ответы, но просто я просто не понимаю их и как применить его к моему коду, чтобы он работал.

Итак, некоторый код. Это из моего представления, где у меня есть форма и кнопка отправки. Когда пользователь нажимает на это, инициируется запрос Ajax.

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

Так что прежде, модель я использую для этих сообщений выглядит следующим образом

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

Так я создать объект, а затем я отправить это через Ajax POST к Web Api контроллера я хотите использовать. Метод отвечает на этот запрос выглядит следующим образом

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

при отладке chatMessage объекта кажется, чтобы получить заселена, как предполагалось, содержащий объекты для grouppe и «пользователь». Я также могу получить текст и дату, как и предполагалось (я заменил это с помощью некоторого кода отладки-dummie-кода). Однако, когда вы достигаете строки db.ChatMessage.Add(chatMessage), где я пытаюсь добавить это в базу данных, я получаю ошибку в заголовке.

Я просто не знаю, что делать, и я не могу видеть, как я использую несколько контекстов и т. Д.

Вся помощь очень ценится, спасибо много заблаговременно!

+0

Как вы создаете экземпляр DbContext? – CodeNotFound

+0

Привет! Только после объявления класса для контроллера у меня есть следующее: private ApplicationDbContext db = new ApplicationDbContext(); – KnoxCorsair

ответ

1

Кажется, что ваш DbContext не восстанавливается, когда вы нажимаете на действие PostChatMessage.

Вы можете исправить эту проблему, делая это:

// 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

Смежные вопросы