Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DbContext中保留具有相同键的多个对象_C#_Asp.net Mvc_Entity Framework_Ef Code First - Fatal编程技术网

C# 在DbContext中保留具有相同键的多个对象

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; }

我首先尝试使用实体框架代码创建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 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();