当尝试插入时,实体对象不能被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)行时,我试图实际将其添加到数据库中,我得到标题中的错误。

我只是不知道该怎么做,我不知道我是如何使用多个上下文之类的。

所有的帮助是非常感激的,提前感谢很多!

当尝试插入时,实体对象不能被IEntityChangeTracker错误的多个实例引用

当您点击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();
}