C# 尝试插入时,entity对象无法被IEntityChangeTracker错误的多个实例引用
我已经开始尝试使用Web API,并努力使其正常工作。我建立了一个普通的MVC5项目,在这个项目中,我为我正在处理的不同类型的数据建立了模型,还有普通的,即非WebAPI控制器 现在,我所做的是将Web API安装到项目中。这里的思想是通过使用Ajax,当用户单击按钮时,通过一个帖子将数据发送到我设置的WebAPI控制器 我想在这里做的是接收数据,并使用EF6将其保存到SQL数据库中 不过。我不断发现这个问题标题中的错误。我已经到处搜索过了,是的,到处都有答案,但简单地说,我就是不明白它们,以及如何将它们应用到我的代码中,使其工作 所以,一些代码。这是我的观点,我有一个表单和一个发送按钮。当用户单击此按钮时,将启动Ajax请求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数据库中 不过。我不断发现这个问题标题中的错误。我已经到处搜索过了,是的,到处都有答案,但简单地说,我就是不明白它们,以及
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();