实体框架:为什么 DbContext 是一个具体的类而不是一个抽象的类?



我想知道为什么使用实体框架时的核心类DbContext类是一个具体的类。

事实上,我们从不直接使用这个类,只是通过继承它。

宣布它是抽象的不是更干净吗?它成为一个具体类的原因是什么?

只有做出这个决定的人才能确定。但是,请注意,DbContext中没有必须由子类提供的行为,因此,如果您将其抽象化 - 那只是因为您想阻止直接使用它。但它可以直接使用:

using (var ctx = new DbContext("EntityConnectionString")) {
var errors  = ctx.Set<Error>().ToArray();
Console.WriteLine(errors.Length);
}

如果传递实体连接字符串(或在 app.config 中传递它的名称(,它可以从 emdx 模型生成模型(也可以直接在其他方案中使用(。有了它,您可以像往常一样进行查询、保存更改等,而不是仅使用Set<T>方法声明DbSet属性。

由于它本身使用时不会损坏 - 我认为没有太多理由通过使其抽象来防止这种情况。

...我们从不直接使用这个类...

尽管它主要通过从中派生类型并向其添加其他基于DbSet的属性来使用,但它本身也可以使用:

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
namespace PlayAreaCSCon
{
class Program
{
static void Main(string[] args)
{
var mb = new DbModelBuilder();
mb.RegisterEntityType(typeof(Foo));
var pinfo = new DbProviderInfo("System.Data.SqlClient", "2008");
var ctx = new DbContext("Server=.;Database=Flange;Integrated Security=SSPI;",
mb.Build(pinfo).Compile());
ctx.Set<Foo>().Add(new Foo { ID = 1 });
ctx.SaveChanges();
Console.ReadKey();
}
}
public class Foo
{
public int ID { get; set; }
}
}

刚刚在我的Flange数据库中创建了一个Foos表并插入了一行。由于它本身功能齐全,因此没有理由阻止人们像这样使用它,如果他们选择这样做的话。

最新更新