我什么时候需要在EF的DbContext中指定DbSet?

问题描述 投票:2回答:2

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

让我解释一下,这是我的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:很多

[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; }
} 

简单。现在,我想查询所有Table2s与相应的Table1s。我做:

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连接(定义没有改变)。这意味着,您必须只有一个表“链”中的一个表。那是对的吗?

c# asp.net .net entity-framework dbcontext
2个回答
© www.soinside.com 2019 - 2024. All rights reserved.