使对动态表LINQ EF6代码优先的访问成为可能

阿尔宾M

此处表后面的代码确实在数据库中生成了一个新的动态表。但是,我不知道如何访问它或如何通过C#代码添加到它的链接。

3NF,三张桌子。

表格:

public class Student
{
    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CourseId { get; set; }
    [Index("CourseName", 2, IsUnique = true)]
    public string CourseName { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

DBContext.cs

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
       .HasMany<Course>(s => s.Courses)
       .WithMany(c => c.Students)
       .Map(cs =>
       {
           cs.MapLeftKey("FK_StudentID");
           cs.MapRightKey("FK_CourseID");
           cs.ToTable("StudentCourse");
       });
}

上面的代码在这里创建了一个像这样的表:

StudentCourse 
=================================
|  FK_StudentID  | FK_CourseID  |
=================================

编辑:我现在正在看这个问题, 如何通过Fluent API实体框架定义多对多关系?

编辑,澄清: 很抱歉,我的延迟:这与何时(例如您已经有学生或单独添加学生)更相关。但是,然后要动态地将它们连接到一个或多个课程。同样,您添加新课程。但是,这些可以由学生采取。

David Browne-微软

但是,我不知道如何访问它或如何通过C#代码添加到它的链接。

在EF6中,您不能直接访问它。而是只需将项目添加/删除到Student.CoursesCourse.Students导航属性。

例如

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace Ef6Test
{

    public class Student
    {
        [Key, Column(Order = 1)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public virtual ICollection<Course> Courses { get; } = new HashSet<Course>();
    }

    public class Course
    {
        [Key, Column(Order = 1)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CourseId { get; set; }
        [Index("CourseName", 2, IsUnique = true)]
        [StringLength(100)]
        public string CourseName { get; set; }

        public virtual ICollection<Student> Students { get; } = new HashSet<Student>();
    }
    public class TestContext : DbContext
    {
        public DbSet<Student> Students { get; set; }
        public DbSet<Course> Courses { get; set; }
    }

    internal class Program
    {

        public static void Main(string[] args)
        {
            
            using (var db = new TestContext())
            {
                db.Database.Log = m => Console.WriteLine(m);

                if (db.Database.Exists())
                    db.Database.Delete();

                db.Database.Create();

                var s = new Student();
                db.Students.Add(s);
                s.Courses.Add(new Course());
                db.SaveChanges();
            }
        }

    }
}

输出

Started transaction at 1/6/2021 11:52:17 AM -06:00

INSERT [dbo].[Courses]([CourseName])
VALUES (NULL)
SELECT [CourseId]
FROM [dbo].[Courses]
WHERE @@ROWCOUNT > 0 AND [CourseId] = scope_identity()


-- Executing at 1/6/2021 11:52:17 AM -06:00

-- Completed in 9 ms with result: SqlDataReader



INSERT [dbo].[Students]([StudentName], [DateOfBirth])
VALUES (NULL, NULL)
SELECT [StudentID]
FROM [dbo].[Students]
WHERE @@ROWCOUNT > 0 AND [StudentID] = scope_identity()


-- Executing at 1/6/2021 11:52:17 AM -06:00

-- Completed in 7 ms with result: SqlDataReader



INSERT [dbo].[StudentCourses]([Student_StudentID], [Course_CourseId])
VALUES (@0, @1)

-- @0: '1' (Type = Int32)

-- @1: '1' (Type = Int32)

-- Executing at 1/6/2021 11:52:17 AM -06:00

-- Completed in 17 ms with result: 1



Committed transaction at 1/6/2021 11:52:17 AM -06:00

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改模型时,EF6代码优先删除表(不是整个数据库)

来自分类Dev

将现有数据库表添加到EF6代码优先存储库

来自分类Dev

EF6代码首先使用数据注释来填充有关SQL表和列的描述

来自分类Dev

EF6代码优先模型ForeignKey

来自分类Dev

EF6代码优先-可能导致循环或多个级联路径

来自分类Dev

使用SQLite 3代码优先的Entity Framework 6-无法创建表

来自分类Dev

实体框架6代码优先查找表未填充

来自分类Dev

实体框架6代码优先Fluent API表映射

来自分类Dev

EF6代码优先对表进行复数的对象名称无效

来自分类Dev

EF6代码优先:使用Fluent API声明外键

来自分类Dev

EF6代码优先更改数据值

来自分类Dev

如何以EF6代码优先的方式删除实体之间的关系?

来自分类Dev

具有相同实体的2个属性时的EF6代码优先混淆

来自分类Dev

EF6代码优先:更新数据库登录失败

来自分类Dev

EF6代码优先:将参数传递给映射的删除存储过程

来自分类Dev

EF6 Linq查询以视图模型联接表

来自分类Dev

EF6代码优先,具有通用存储库以及依赖注入和SoC

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

如何在EF6代码优先中对数据库上下文使用通用类型

来自分类Dev

如何为一个模型创建两个导航属性(EF6代码优先)

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

EF 6代码优先存储过程-只读

来自分类Dev

在EF Linq to Entities中使用动态linq

来自分类Dev

EF6 +代码优先+流利:错误无法将值NULL插入列“ ID”,表“ X”列不允许为空

来自分类Dev

在实体框架6代码优先方法中在两个表之间创建一对多和多对一映射

来自分类Dev

LINQ中的动态表名称

来自分类Dev

在LINQ中动态选择表

来自分类Dev

实体框架5代码优先。如何指定我要删除的表?

来自分类Dev

使用EF6代码优先的MySQL现有数据库-带有脚手架的控制器创建错误

Related 相关文章

  1. 1

    更改模型时,EF6代码优先删除表(不是整个数据库)

  2. 2

    将现有数据库表添加到EF6代码优先存储库

  3. 3

    EF6代码首先使用数据注释来填充有关SQL表和列的描述

  4. 4

    EF6代码优先模型ForeignKey

  5. 5

    EF6代码优先-可能导致循环或多个级联路径

  6. 6

    使用SQLite 3代码优先的Entity Framework 6-无法创建表

  7. 7

    实体框架6代码优先查找表未填充

  8. 8

    实体框架6代码优先Fluent API表映射

  9. 9

    EF6代码优先对表进行复数的对象名称无效

  10. 10

    EF6代码优先:使用Fluent API声明外键

  11. 11

    EF6代码优先更改数据值

  12. 12

    如何以EF6代码优先的方式删除实体之间的关系?

  13. 13

    具有相同实体的2个属性时的EF6代码优先混淆

  14. 14

    EF6代码优先:更新数据库登录失败

  15. 15

    EF6代码优先:将参数传递给映射的删除存储过程

  16. 16

    EF6 Linq查询以视图模型联接表

  17. 17

    EF6代码优先,具有通用存储库以及依赖注入和SoC

  18. 18

    EF6代码优先-使用不匹配的外键配置一对一关系

  19. 19

    如何在EF6代码优先中对数据库上下文使用通用类型

  20. 20

    如何为一个模型创建两个导航属性(EF6代码优先)

  21. 21

    EF6代码优先-使用不匹配的外键配置一对一关系

  22. 22

    EF 6代码优先存储过程-只读

  23. 23

    在EF Linq to Entities中使用动态linq

  24. 24

    EF6 +代码优先+流利:错误无法将值NULL插入列“ ID”,表“ X”列不允许为空

  25. 25

    在实体框架6代码优先方法中在两个表之间创建一对多和多对一映射

  26. 26

    LINQ中的动态表名称

  27. 27

    在LINQ中动态选择表

  28. 28

    实体框架5代码优先。如何指定我要删除的表?

  29. 29

    使用EF6代码优先的MySQL现有数据库-带有脚手架的控制器创建错误

热门标签

归档