是否可以在实体框架中的连接方案中添加实体。我可以更新数据,但是对于添加和删除,它在连接模式下不起作用。
md.Configuration.AutoDetectChangesEnabled = true;
var studentList = md.MyStudent.ToList<Student>();
studentList.Add(new Student { Stdname = "nm" });
md.SaveChanges();
新项目(“nm”)不会被添加!!!
EDITED
为什么这样做,更新操作和Add不起作用,有什么区别?
数据库将被更新
Student studentToUpdate = studentList.Where(s => s.Stdname == "stdname1").FirstOrDefault<Student>();
studentToUpdate.Stdname = "Edited stdname3";
答案 0 :(得分:1)
您的代码无效,因为您的ToList<Student>()
会返回与您的上下文无关的新列表。这类似于以下代码:
IList<Student> studentList = new List<Student>();
studentList.Add(new Student { Stdname = "nm" });
您的实体框架中的上下文并不关心您的程序中是否有某处列表并向其添加对象。
编辑列表中的现有对象是有效的,因为它们是从上下文加载的,因此它们已被注册&#34;在上下文中。
如果要添加新对象,则必须将其添加到md.MyStudent
,以便上下文看到应添加新对象。
答案 1 :(得分:0)
尝试使用md.MyStudent.Add()
方法。
稍作解释
EF具有更改跟踪机制,因此它可以自动保留您对实体所做的更改。但是,EF必须知道您的对象/实体才能检测到更改。
在第二个示例中,EF了解学生实体,因为它是由框架创建的,您在Where()
实例上应用了DbSet
扩展方法,该实例是EF上下文的一部分。
在您的第一个示例中,您还检索了DbSet
中的实体,但是这次您应用了ToList()
扩展方法,该方法创建了一个新的List<Student>
实例,其中包含存储在中的所有学生您的数据库,但EF没有对该列表的引用,只有它知道列表中的实体。因此,如果您添加/删除该列表中的项目,EF将无法了解您的更改。您仍然可以对列表中的实体进行更改,并将修改保存到数据库中。