是否可以像使用类型化数据集一样轻松地导航实体框架中的实体?

时间:2009-07-08 15:07:49

标签: .net .net-3.5

是否可以像使用类型化数据集一样轻松导航实体框架中的实体?

使用类型化数据集,您可以从一个sproc加载许多表,然后只使用如下语句:

//get student’s course
StudentsDS.Course drCourse = drStudent.CoursesRowParent;

// get course students
foreach (StudentsDS.StudentRow dr in ds.GetStudentsRows()) 
{
…
}

我有一个新项目,必须决定是否进入EF趋势或保持真实和测试。顺便说一句,我读了很多关于类型数据集的批评,这些数据集是明显错误或夸大的。

对于新项目,我将使用ASP.Net MVC,因为我相信它的优点。 EF ...不太确定。

3 个答案:

答案 0 :(得分:1)

当然,你可以。很难给出一个无中生有的例子,但我试过了。以下代码将打印课程名称中包含“算法”的“John Doe”第一期课程中所有学生的姓名。

using (ObjectContext context = new ObjectContext())
{
    foreach (Student student in context.Students
        .First(student => student.Name == "John Doe")
        .Courses
        .First(course => course.Name.Contains("Algorithms")
        .Students)
    {
        Console.WriteLine(student.Name);
    }
}

如果要访问其他关系,则必须明确加载它们或使用Include()方法。

using (ObjectContext context = new ObjectContext())
{
    foreach (Student student in context.Students.Include("Courses"))
    {
        foreach (Course course in student.Courses)
        {
            Console.WriteLine(student.Name + " " + course.Name);
        }
    }
}

或使用显式加载。

using (ObjectContext context = new ObjectContext())
{
    foreach (Student student in context.Students)
    {
        if (!student.Courses.IsLoaded)
        {
            student.Courses.Load();
        }
        foreach (Course course in student.Courses)
        {
            Console.WriteLine(student.Name + " " + course.Name);
        }
    }
}

答案 1 :(得分:1)

访问相关对象就像在类型化数据集中一样容易。但是,您会发现加载数据存在差异。您将发现最不同的部分是Entity Framework(以及Linq to Sql)不再强调使用存储过程作为填充数据集合的方法。它是可能的,请注意,它不像您习惯使用的数据集那样灵活。因此,从单个存储过程调用中加载多个EntitySets(即DataTable等价物)在Entity Framework中实际上没有用,因为没有真正的DataAdapter等效项。也就是说,DanielBrückner上面的便捷示例将显示您可以非常轻松地在一次调用基础数据存储区中填充多个实体集。实际上,我发现在Entity Framework(和Linq to Sql)中比在强类型DataSet中更容易这样做。

答案 2 :(得分:0)

在我看来,这里的基本论点是你是否认为使用OR / M(对象关系映射器)是一个好主意,以及这种方法是否比你习惯的类型化DataSet方法有任何优势。根据我的经验,使用OR / M是我开发的任何需要持久性的应用程序的基础,并查看this post by Glenn Block(谁比我更好),原因如何。