Я начал немного экспериментировать с веб-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)
, где я пытаюсь добавить это в базу данных, я получаю ошибку в заголовке.
Я просто не знаю, что делать, и я не могу видеть, как я использую несколько контекстов и т. Д.
Вся помощь очень ценится, спасибо много заблаговременно!
Как вы создаете экземпляр DbContext? – CodeNotFound
Привет! Только после объявления класса для контроллера у меня есть следующее: private ApplicationDbContext db = new ApplicationDbContext(); – KnoxCorsair