【问题标题】:How to get the foreign key in Entity Framework?如何在实体框架中获取外键?
【发布时间】:2009-03-07 06:58:40
【问题描述】:

我正在 .NET 3.5 SP1 MVC 应用程序中开发 StudentApp。

我有两张桌子

  1. 课程
    课程 ID、课程名称
  2. 学生
    studentID、student_Name、courseID(fk)

现在我制作了StudentApp.dbml,它将两个表都作为实体。

由于外键不会出现在学生实体中, 我无法在学生模型中显示 courseID,而且我无法生成添加、编辑、列表视图。

那么告诉我如何在学生中显示 courseID(fk),我还想要课程名称。

还有显示课程名称和在编辑视图中存储课程 ID 的下拉框。

【问题讨论】:

  • 您确定您使用的是实体框架吗? DBML 映射文件用于 Linq to Sql
  • 你说得对,它是实体框架
  • 请编辑问题以使其有意义。 L2S 和 EF 处理外键完全不同。

标签: asp.net-mvc entity-framework


【解决方案1】:

我很确定您必须为每个实体加载外部引用。因为我不知道你是如何构建你的 API 的,所以我不得不给你一个伪代码的例子,但我认为这是你需要做的。

List<Students> studList = [your_db_facade].SelectStudents() // Or however you retrieve your students

foreach (Students singleStudent in studList)
    singleStudent.Context.CourseReference.Load() //CourseReference.Load() should be in the framework

然后您从单个学生实体中获取 CourseID 和名称,例如

singleStudent.Course.CourseID
singleStudent.Course.course_Name

对您来说可能看起来略有不同,但我认为解决您的问题的关键是 CourseReference.Load()。

【讨论】:

    【解决方案2】:

    如果您使用 LINQ-to-SQL 并在 Visual Studio 中创建了 DBML 文件,则可以通过 Course 对象中的 Course 属性列出外键(自动生成,因为它是一对一许多关系来自Student)。有点像这样:

    var studentCourseIds =
        from s in context.Students
        select s.Course.CourseID;
    

    由于您的目标是找到课程名称,因此可以使用 Student.Course.course_Name 访问它。

    【讨论】:

    • 谢谢。我已经使用过 LINQ to SQL 类。我的目标是在列出所有记录的视图中显示学生对象。所以我把上面的代码放在哪里,因为我使用的是 MVC 架构..?
    • Vikas:这取决于您对 MVC 使用的策略。在我的 MVC 中,我在模型中创建存储库类(它是一个存储库模式的东西),它通常从数据库中返回我想要的东西。然后我有一个服务类,可以进一步从存储库中过滤我想要的内容。
    【解决方案3】:

    您可以发布您的 DBML 吗?此外,DBML 用于 LINQ to SQL (L2S) - EDMX 是 ADO 实体框架中使用的映射。您使用的是 LINQ to SQL 还是实体框架 (EF)?

    无论您使用哪一个 - 它们都支持外键,并且您将获得代表关系任一方的属性 - 您不需要做任何特殊的事情(当然,外键必须存在于数据库中)。

    在 EF 中,外键称为“导航属性”,它们的工作方式与 L2S 中的外键略有不同。没什么大不了的,但是更新它们和“急切加载”有些不同。

    只需在 Visual Studio 的设计器中将表格拖放到地图上(如果您愿意,也可以使用命令行等效项生成)。

    关于外键和下拉列表(以及其他 UI 优点) - 我写了几篇博客文章,介绍了一些可能适合您的方法。第一部分位于here,第二部分位于here

    【讨论】:

    • StudentApp.dbml 是一个实体数据模型。所以在学生表 courseID 中不会有映射。映射被视为一种关联。此外,我正在使用 MVC 架构。我添加了一个学生的索引视图,因此它将从 StudentApp.model 继承,后者是实体框架自动生成的类。
    【解决方案4】:

    如果您在 SQL Server 数据库中创建了正确的关系,那么当您将表添加到 DBML 设计器时,这些关系也将被复制,并且您的代码将自动链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多