当前位置: 首页 > 编程语言 > C#

实体框架:将现有的子POCO添加到新的父POCO中,在DBShare中创建新的子项

时间:2023-04-10 22:05:47 C#

实体框架:将现有的子POCO添加到新的父POCO中,在DB中创建新的子项我想使用Entity框架POCO处于断开连接(从上下文)模式。在我的场景中,我正在创建一个新的Parent对象并想将现有的子对象附加到它,然后将它保存到db。下面的代码在保存新学生记录时意外地插入了新课程记录,而我希望现有课程记录链接到新学生记录。我如何在EntityFramework中执行此操作...此页面显示了一个数据库图,下面的代码基于http://entityframeworktutorial.net/EF4_EnvSetup.aspx#.UPMZ4m-UN9YclassProgram{staticvoidMain(string[]args){//从数据库中获取现有课程作为断开连接的对象varcourse=Program.getCourse();//创建新学生varstud=newStudent();stud.StudentName="bob";//将现有课程分配给学生stud.Courses.Add(course);//使用(SchoolDBEntitiesctx=newSchoolDBEntities()){ctx.Students.AddObject(stud);//将学生保存到数据库ctx.SaveChanges();}}staticCoursegetCourse(){课程returnCourse=null;使用(varctx=newSchoolDBEntities()){ctx.ContextOptions.LazyLoadingEnabled=false;returnCourse=(fromsinctx.Coursesselects).SingleOrDefault();返回返回课程;有几种方法可以定位。您可以指定课程实体不变,而不是添加如下:ctx.Entry(course).State=EntityState.Unchanged;或指示您正在使用现有实体的上下文:ctx.Courses.Attach(course);更多更多信息:http://msdn.microsoft.com/en-us/data/jj592676.aspx编辑我的解决方案中有一些正在运行的样本,我验证了它们按预期工作。在所有情况下,我们在数据库中都有ID=2、名称="AddisonWesley"的Publisher记录(与示例无关,但只是为了更好地衡量)。方法1-使用(varcontext=newContext()){varbook=newBook();设置实体状态book.Name="服务设计模式";book.Publisher=newPublisher(){Id=2};//只需要IDcontext.Entry(book.Publisher).State=EntityState.Unchanged;context.Books.Add(书籍);context.SaveChanges();}方法2-使用Attach方法using(varcontext=newContext()){varbook=newBook();book.Name="服务设计模式";book.Publisher=newPublisher(){Id=2};//只需要IDcontext.Publishers.Attach(book.Publisher);context.Books.Add(书籍);context.SaveChanges();}方法3-使用(varcontext=newContext()){varbook=newBook();设置外键值book.Name="服务设计模式";book.PublisherId=2;context.Books.Add(书籍);context.SaveChanges();对于这个最终的工作方法,我需要添加一个额外的属性PublisherId,它必须遵循NavigationPropertyName+'Id'约定命名,由EF自动获取:publicintPublisherId{get;放;}publicPublisherPublisher{get;放;}我在这里这里使用的是EF5CodeFirst,但是和POCO实体框架非常相似,不允许跨上下文关系。如果您将classread和connectclasstostudent放在同一个用法语句中,它将起作用。我还尝试了对我有用的第二个选项。我确实喜欢首先在对象级别发生并保存到数据库的父->子关系。也许我应该删除EF生成的实体之间的所有关系并自己手动控制它。以上是C#学习教程:实体框架:将已有的子POCO添加到新的父POCO中,在DB中新建子项,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关照——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: