C# 尝试插入时,entity对象无法被IEntityChangeTracker错误的多个实例引用

C# 尝试插入时,entity对象无法被IEntityChangeTracker错误的多个实例引用,c#,ajax,asp.net-mvc,entity-framework,asp.net-web-api,C#,Ajax,Asp.net Mvc,Entity Framework,Asp.net Web Api,我已经开始尝试使用Web API,并努力使其正常工作。我建立了一个普通的MVC5项目,在这个项目中,我为我正在处理的不同类型的数据建立了模型,还有普通的,即非WebAPI控制器 现在,我所做的是将Web API安装到项目中。这里的思想是通过使用Ajax,当用户单击按钮时,通过一个帖子将数据发送到我设置的WebAPI控制器 我想在这里做的是接收数据,并使用EF6将其保存到SQL数据库中 不过。我不断发现这个问题标题中的错误。我已经到处搜索过了,是的,到处都有答案,但简单地说,我就是不明白它们,以及

我已经开始尝试使用Web API,并努力使其正常工作。我建立了一个普通的MVC5项目,在这个项目中,我为我正在处理的不同类型的数据建立了模型,还有普通的,即非WebAPI控制器

现在,我所做的是将Web API安装到项目中。这里的思想是通过使用Ajax,当用户单击按钮时,通过一个帖子将数据发送到我设置的WebAPI控制器

我想在这里做的是接收数据,并使用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; }
}
[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);
}
因此,我创建了一个对象,然后通过Ajax帖子将其发送给我想要使用的webapi控制器。响应此请求的方法如下所示

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; }
}
[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);
}
[路由(“api/ChatMessages/post”)]
[响应类型(类型(聊天信息))]
公共异步任务PostChatMessage(ChatMessage chatMessage2)
{
ApplicationUser user=System.Web.HttpContext.Current.GetOwinContext().GetUserManager().FindById(System.Web.HttpContext.Current.user.Identity.GetUserId());
ChatMessage ChatMessage=新建ChatMessage();
Grouppe=newgrouppe();
grouppe.GrouppeID=4;
chatMessage.ChatMessageOwner=用户;
chatMessage.ChatMessageText=“测试”;
chatMessage.ChatMessageTime=DateTime.Now;
chatMessage.Grouppe.GrouppeID=Grouppe.GrouppeID;
db.ChatMessage.Add(ChatMessage);
等待db.saveChangesSync();
返回CreatedAtRoute(“DefaultApi”,新的{id=chatMessage.ChatMessageID},chatMessage);
}
调试时,
chatMessage
对象似乎按预期填充,包含
grouppe
和“user”的对象。我还可以按预期获取文本和日期(我现在已经用一些调试伪代码替换了它们)。但是,当到达我试图实际将其添加到数据库的行
db.ChatMessage.Add(ChatMessage)
时,我在标题中得到了错误

我只是不知道该怎么做,也看不出我是如何使用多个contexte之类的


非常感谢所有的帮助,提前感谢

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

如何创建DbContext实例?您好!在控制器的类声明之后,我有这样一个命令:private ApplicationDbContext db=new ApplicationDbContext();