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

时间:2014-05-19 04:07:00

标签: c# asp.net entity-framework webforms

我正在尝试使用本教程Getting Started with Entity Framework

学习实体框架

但是我遇到了麻烦,因为教程正在使用Entity Framework 4,而我的visual studio自动使用Entity Framework 6.我还尝试安装Entity Framework 4。但实体数据模型向导不允许我选择是否使用Framework 6或Framework 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'的第一个参数可以找到(是你错过了使用指令或汇编引用?)C:\ Users \ Karl \ documents \ visual studio 2013 \ Projects \ ContosoUniversity \ ContosoUniversity \ Instructors.aspx.cs 44 55 ContosoUniversity

错误2'ContosoUniversity.OfficeAssignment'不包含'CreateOfficeAssignment'的定义C:\ Users \ Karl \ documents \ visual studio 2013 \ Projects \ ContosoUniversity \ ContosoUniversity \ Instructors.aspx.cs 44 82 ContosoUniversity

错误3'ContosoUniversity.SchoolEntities'不包含'DeleteObject'的定义,也没有扩展方法'DeleteObject'接受类型'ContosoUniversity.SchoolEntities'的第一个参数(你是否缺少using指令或程序集)参考?)C:\ Users \ Karl \ documents \ visual studio 2013 \ Projects \ ContosoUniversity \ ContosoUniversity \ Instructors.aspx.cs 56 37 ContosoUniversity

可能的解决方法是什么?

2 个答案:

答案 0 :(得分:3)

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

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

根本原因是EntityFramework 4和5之间的差异。实际上在文章的开头就已经注意到了这一点,但是直到我做了更多的阅读然后再回到它,我才明白他们在哪里解释。< / p>

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

对于那些发现自己在同一个问题的人来说,Contoso大学示例在VisStudio2012(或更确切地说是EF5)中不起作用的原因围绕着这样一个事实,即在EF4中创建的数据库上下文是一个ObjectContext,在EF5中你的是作为较新的DBContext创建的。因此,本教程中提到的优化部分将无法工作,您将收到有关无法转换为ObjectContext的错误(请参阅上面的链接以解决此问题,您基本上用创建上下文的事件调用替换此部分)。

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

而不是Addobject()我们添加() 而不是DeleteObject()使用Remove() 而不是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.
            }
        }
    }

答案 1 :(得分:0)

这应该有效(未经过测试..)

context.OfficeAssignments.Add(new OfficeAssignment(instructorBeingUpdated, instructorOfficeTextBox.Text, null));

context.officeAssignments.remove(officeAssignment);

var allCourses = context.Courses().ToList();