【问题标题】:Workarounds from Entity Framework 4 to 6从 Entity Framework 4 到 6 的变通方法
【发布时间】:2014-05-19 04:06:59
【问题描述】:

我正在尝试通过本教程学习实体框架Getting Started with Entity Framework

但我遇到了麻烦,因为本教程使用的是 Entity Framework 4,而我的 Visual Studio 自动使用 Entity Framework 6。我也尝试安装 Entity Framework 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”的定义,并且找不到接受“System.Data.Entity.DbSet”类型的第一个参数的扩展方法“AddObject”(是您缺少 using 指令或程序集引用?) 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”的定义,并且找不到接受“ContosoUniversity.SchoolEntities”类型的第一个参数的扩展方法“DeleteObject”(您是否缺少 using 指令或程序集参考?)C:\Users\Karl\documents\visual studio 2013\Projects\ContosoUniversity\ContosoUniversity\Instructors.aspx.cs 56 37 ContosoUniversity

可能的解决方法是什么?

【问题讨论】:

  • #define “不起作用”。编译错误?运行时错误?用户错误?
  • 太棒了。你能告诉我们是什么线吗?也许确切的错误信息?

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


【解决方案1】:

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

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

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

我们用 Add() 代替 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.
            }
        }
    }

【讨论】:

    【解决方案2】:

    应该可以工作(未经测试..)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      相关资源
      最近更新 更多