关于DbSet和DbContext

50

我看到了一段混合使用 DbSetDbContext 的代码,但我对 Entity Framework 不是很熟悉。我认为它们是两个不同的东西。有人可以给我简单地解释一下吗?

public class testContext : DbContext
{
    public testContext();

    public string IPAddress { get; set; }
    public DbSet<WSettings> Settings { get; set; }
    public string UserName { get; set; }

    public override int SaveChanges();
}
2个回答

94

直观地说,一个DbContext对应着你的数据库(或者是你数据库里的一系列表和视图),而一个DbSet则对应着你数据库中的一个表或视图。所以同时使用它们是非常合理的!

你将使用一个DbContext对象来获取对你的表和视图的访问权(它们将用DbSet表示),并且你将使用你的DbSet来获取对表数据的访问、创建、更新、删除和修改。

如果你的数据库里有10个表,而你的应用程序只需要使用其中的5个(我们把它们叫做Table1 - Table 5),那么使用一个名为MyAppContext的对象来访问它们就是有意义的,其中MyAppContext类定义如下:

public class MyAppContext : DbContext
{
    public MyAppContext () : ;

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

注意,例如,标识符Table1既用作类型名称,又用作定义上下文类型中属性的名称。你在上面看到的是非常典型的情况。 下面给出了一个对应于表模式的类的示例:

public class Table1 
{
   public int Id {get; set;}
   public string AStringField {get; set;}
   //etc.
}

请点击此处查看更多信息:http://entityframeworktutorial.net/


6
通常情况下,我认为习惯上应该用单数形式来表示 DbSet 的类型参数,用复数形式来表示属性名称。例如:public DbSet<Customer> Customers { get; set; } - DavidRR

25

DbContext一般代表一个数据库连接和一组表。而DbSet则用于表示一个表。

您的代码示例不符合预期的模式。首先,它是不完整的。另外,还有一些属性不应该出现。

这个典型的模式如下:

class User
{
   public string IPAddress { get; set; }
   public ICollection<Settings> Settings { get; set; }
   public string UserName { get; set; }
}

class MyContext : DbContext
{
   public DbSet<User> Users { get; set; }
   public DbSet<Settings> Settings { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接