C# 在DbContext中保留具有相同键的多个对象
我首先尝试使用实体框架代码创建ASP.NET MVC web应用程序。 我有两个简单的模型C# 在DbContext中保留具有相同键的多个对象,c#,asp.net-mvc,entity-framework,ef-code-first,C#,Asp.net Mvc,Entity Framework,Ef Code First,我首先尝试使用实体框架代码创建ASP.NET MVC web应用程序。 我有两个简单的模型 public class Assignment { public int Id { get; set; } [ForeignKey("Initiator")] public int InititatorId { get; set; } public virtual User Initiator { get; set; }
public class Assignment
{
public int Id { get; set; }
[ForeignKey("Initiator")]
public int InititatorId { get; set; }
public virtual User Initiator { get; set; }
public virtual List<User> Debtors { get; set; }
public virtual List<User> Responsibles { get; set; }
public Assignment()
{
Debtors = new List<User>();
Responsibles = new List<User>();
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string City { get; set; }
}
我需要这样做,因为它是应用程序逻辑所必需的
提前谢谢
更新:
在HttpPost上出现错误(控制台应用程序示例中的错误相同):
视图中的Debtors和Responsebiles元素通过隐藏输入传递。为什么不先获取数据,而不是直接将其附加到dbcontext,相同id的相同赋值可能已在同一上下文中本地附加 而不是这些
assignment.Debtors.RemoveAll(r => r.Name == "Roman");
db.Entry(assignment).State = EntityState.Modified; // HERE!
db.SaveChanges();
试试这些
var assignmentDb = db.Assignments.FirstOrDefault(asg => asg.Id == assignment.Id);
assignmentDb.Debtors.RemoveAll(r => r.Name == "Roman");
db.SaveChanges();
我无法重现错误,你确定这就是你所有的代码吗?@YuliamChandra是的,你是对的,当我们创建DB时,错误不会出现。但当我们试图更改某些内容(删除债务人列表中的一个条目)时,我们会在code
db.entry(assignment.State=EntityState.Modified中得到错误代码>@YuliamChandra我不知道或不允许,但我将自己发布包含我的项目的两个版本(控制台和asp.net mvc)的存档链接。请在此处发布您的代码,当尝试更改某些内容时,仅相关代码。@YuliamChandra感谢您的回复。代码添加在帖子的底部。谢谢!你是对的!但除了这种情况,我还必须添加db.Entry(assignmentDb).CurrentValues.SetValues(assignment)
应用HttpPost接收到的更改。但是为什么分配
实例可以在没有任何更改的情况下附加到上下文中(就像从用户那里接收到的、在他身边有更改的实例一样),并且在我删除某些内容时不能附加?@user172805,是的,您需要将ui实体
中的更改应用到db实体
,但是我更喜欢手动应用更改db.X=ui.X,因为ui实体
可能有害。如果dbcontext
变量db
存储为类字段变量,dbcontext
在您第一次附加它时可能已经加载了实体,我更喜欢每次操作都创建dbcontext并立即处理它,以防止在调试应用程序时出现像这样的意外行为db.dispose()代码>方法与所有请求一起调用。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,Text,CreationDate,InititatorId,Debtors,Responsibles")] Assignment assignment)
{
if (ModelState.IsValid)
{
assignment.Debtors.RemoveAll(r => r.Name == "Roman");
db.Entry(assignment).State = EntityState.Modified; // HERE!
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.InititatorId = new SelectList(db.Users, "Id", "Name", assignment.InititatorId);
return View(assignment);
}
assignment.Debtors.RemoveAll(r => r.Name == "Roman");
db.Entry(assignment).State = EntityState.Modified; // HERE!
db.SaveChanges();
var assignmentDb = db.Assignments.FirstOrDefault(asg => asg.Id == assignment.Id);
assignmentDb.Debtors.RemoveAll(r => r.Name == "Roman");
db.SaveChanges();