从实体框架4到6的变通方法

本文关键字:方法 实体 框架 | 更新日期: 2023-09-27 18:04:03

我正在尝试学习实体框架与本教程开始与实体框架

但我有麻烦,因为教程是使用实体框架4,而我的visual studio自动使用实体框架6。我也尝试安装实体框架4。但是实体数据模型向导不让我选择是使用框架6还是框架4

下面是不能工作的代码。

context.OfficeAssignments.AddObject(OfficeAssignment.CreateOfficeAssignment(instructorBeingUpdated, instructorOfficeTextBox.Text, null));
context.DeleteObject(officeAssignment);
var allCourses = context.GetCourses().ToList();

错误1 'System.Data.Entity. 'DbSet'没有包含'AddObject'的定义,也没有扩展方法'AddObject'接受类型为'System.Data.Entity '的第一个参数。可以找到DbSet'(您是否缺少using指令或程序集引用?)c:' users ' carl 'documents'visual studio 2013'Projects'ContosoUniversity'ContosoUniversity'Instructors.aspx.cs 44 55 contosouniuniversity

错误2 ' contouniversity。C:'Users'Karl'documents'visual studio 2013'Projects'ContosoUniversity'ContosoUniversity'Instructors.aspx.cs 44 82 contosouniuniversity

错误3 ' contouniversity。SchoolEntities'不包含'DeleteObject'的定义,也没有扩展方法'DeleteObject'接受类型为' contosoununiversity '的第一个参数。可以找到SchoolEntities(您是否缺少using指令或汇编参考?)c:' users ' carl 'documents'visual studio 2013'Projects'ContosoUniversity'ContosoUniversity'Instructors.aspx.cs 56 37 contosouniuniversity

可能的变通方法是什么?

从实体框架4到6的变通方法

http://forums.asp.net/t/1876088.aspx

谢谢这些链接伙计们。在这里的文章和你提供的链接之间,我能够阅读更多,并弄清楚发生了什么。

根本原因是EntityFramework 4和5之间的差异。这实际上是在文章的开头指出的,但直到我读了更多的书,然后回到它,我不明白他们在解释什么。

(解释:http://blogs.msdn.com/b/webdev/archive/2012/09/13/how-to-use-the-entitydatasource-control-with-entity-framework-code-first.aspx)

对于任何发现自己在这里看同样问题的人来说,康托索大学的例子在VisStudio2012(或者更确切地说是EF5)中不起作用的原因是围绕这样一个事实,即在EF4中创建的数据库上下文是一个ObjectContext,在EF5中,您的数据库上下文被创建为一个更新的DBContext。因此,在教程中提到的优化部分将不起作用,你会得到关于无法转换到ObjectContext的错误(见上面的链接来修复这个问题,你基本上用创建上下文的事件调用替换这部分)。

我遇到的第二个问题是在第4部分中,您通过代码更新GridView行(以显示办公室分配)。原因还是一样的,旧的ObjectContext(当您查看创建的SchoolModel.Entities.cs时)使用ObjectSet<>来表示表对象。DBContext将它们创建为DBset<>,并且每种类型中的方法是不同的。

Add()代替Addobject()用Remove()代替DeleteObject()使用....代替CreateOfficeAssignment()好吧,我不确定,所以我只是创建了一个实体,我不确定这是坏还是好。这是我修改后的代码,现在看起来可以工作了(原来的行被注释掉了):

protected void InstructorsGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        using (var context = new SchoolContext())
        {
            var instructorBeingUpdated = Convert.ToInt32(e.Keys[0]);
            var officeAssignment = (from o in context.OfficeAssignments
                                    where o.InstructorID == instructorBeingUpdated
                                    select o).FirstOrDefault();
            try
            {
                if (String.IsNullOrWhiteSpace(instructorOfficeTextBox.Text) == false)
                {
                    if (officeAssignment == null)
                    {
                        //context.OfficeAssignments.AddObject(OfficeAssignment.CreateOfficeAssignment(instructorBeingUpdated, instructorOfficeTextBox.Text, null));
                        context.OfficeAssignments.Add(new OfficeAssignment { InstructorID = instructorBeingUpdated, Location = instructorOfficeTextBox.Text, Timestamp = null });
                    }
                    else
                    {
                        officeAssignment.Location = instructorOfficeTextBox.Text;
                    }
                }
                else
                {
                    if (officeAssignment != null)
                    {
                        //context.DeleteObject(officeAssignment);
                        context.OfficeAssignments.Remove(officeAssignment);
                    }
                }
                context.SaveChanges();
            }
            catch (Exception)
            {
                e.Cancel = true;
                ErrorMessageLabel.Visible = true;
                ErrorMessageLabel.Text = "Update failed.";
                //Add code to log the error.
            }
        }
    }

应该可以工作(未测试…)

context.OfficeAssignments.Add(new OfficeAssignment(instructorBeingUpdated, instructorOfficeTextBox.Text, null));
context.officeAssignments.remove(officeAssignment);
var allCourses = context.Courses().ToList();