c# - 什么时候需要在 EF 的 DbContext 中指定 DbSet?

标签 c# asp.net .net entity-framework dbcontext

我有点困惑。直到今天我还认为每个表(由 EF 使用)都必须在 DbContext 类中指定。但看起来我只需要一个!真的吗?

让我解释一下,这是我的 DbContext:

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("name=MyDbContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(null);
        base.OnModelCreating(modelBuilder);
    }    

    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table2 { get; set; }
    public DbSet<Table3> Table3 { get; set; }
    public DbSet<Table4> Table4 { get; set; }
    public DbSet<Table5> Table5 { get; set; }
}

这里有两个示例表,连接1:many

[Table("Table1")]
public class Table1
{
    [Key]
    [Column("Table1Id", TypeName = "uniqueidentifier")]
    public int Table1Id { get; set; }

    [Column("Table2Id", TypeName = "int")]
    public int Table2Id { get; set; }

    [ForeignKey("Table2Id")]
    public Table2 Table2 { get; set; }
}

[Table("Table2")]
public class Table2
{
    public Table2()
    {
        this.Table1s = new HashSet<Table1>();
    }

    [Key]
    [Column("Table2Id", TypeName = "int")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Table2Id { get; set; }

    public ICollection<Table1> Table1s { get; set; }
} 

简单。现在,我想用相应的 Table1 查询所有 Table2。我这样做:

var tables2 = fni.Set<Table2>()
    .Include(i => i.Table1s)
    .Where(t => t.Table2Id == 123456).ToList();

一切正常,但当我偶然发现它甚至与这个 DbContext 一起工作时,我感到震惊:

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("name=MyDbContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(null);
        base.OnModelCreating(modelBuilder);
    }    


    public DbSet<Table1> Table1 { get; set; }
}

或者这个..

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("name=MyDbContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(null);
        base.OnModelCreating(modelBuilder);
    }    


    public DbSet<Table2> Table2 { get; set; }
}

你能给我解释一下,它为什么有效吗?怎么办?

谢谢!

编辑。它不包括在内。我能够做到:

var tables2 = fni.Set<Table2>()
    .Where(t => t.Table2Id == 123456).ToList();

只有这个:DbContext 中的 public DbSet<Table1> Table1 { get; set; }。它甚至不是 Table2!它们通过 FK 连接(定义没有改变)。所以这意味着,您必须只有一个表“链”中的一个表。对吗?

最佳答案

让我们看看documentation :

我们有以下模型:

public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }

public class Enrollment
    {
        public int EnrollmentID { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
        public Grade? Grade { get; set; }

        public Course Course { get; set; }
        public Student Student { get; set; }
    }

public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }

和数据库上下文:

public class SchoolContext : DbContext
    {
        public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
        {
        }

        public DbSet<Course> Courses { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Student> Students { get; set; }
    }

但是:

You could've omitted the DbSet<Enrollment> and DbSet<Course> statements and it would work the same. The Entity Framework would include them implicitly because the Student entity references the Enrollment entity and the Enrollment entity references the Course entity.

附言。抱歉,我刚刚注意到这个问题与 EF Core 无关。但无论如何我认为这应该是真的。

关于c# - 什么时候需要在 EF 的 DbContext 中指定 DbSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48432116/

相关文章:

asp.net - 插入查询语法问题

c# - 访问模拟用户的 CurrentUser 注册表项 - 与 .NET 3.5 的兼容性

c# - 从 Excel 单元格中的超链接文本中提取 URL

c# - 取消 Hook 事件时检测到 FatalExecutionEngineError

c# - SFTP 和 "FTP over SSH"的区别

asp.net - Web Farm 上的表单例份验证 4.0

c# - 将字符串 "1"或 "0"转换为 bool true 或 false

c# - 使用 Linq 获取 List<string> 集合中的子字符串

c# - 我在尝试实现多重继承吗?我怎样才能做到这一点

c# - Linq删除重复忽略大小写