当尝试插入时,实体对象不能被IEntityChangeTracker错误的多个实例引用
本文关键字:错误 IEntityChangeTracker 引用 实例 不能 插入 对象 实体 | 更新日期: 2023-09-27 18:15:54
我已经开始尝试一下Web API,并努力使其工作。我有一个普通的MVC 5项目设置,在这个我有模型的不同类型的数据,我正在处理,也普通,即非Web API控制器。
现在我所做的是将Web API安装到项目中。这里的想法是通过使用Ajax,当用户单击按钮时,通过POST向我设置的Web 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
和"user"对象。我还可以按预期获取文本和日期(我现在已经用一些调试伪代码替换了它们)。然而,当到达db.ChatMessage.Add(chatMessage)
行时,我试图实际将其添加到数据库中,我得到标题中的错误。
我只是不知道该怎么做,我不知道我是如何使用多个上下文之类的。
所有的帮助是非常感激的,提前感谢很多!
当您点击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();
}