[英]Entity Framework : Why is DbContext a concrete Class and not an abstract class?
我想知道为什么DbContext
类(当使用Entity Framework时是核心类)是一个具体的类。
实际上,我们永远不会仅通过从其继承而直接使用此类。
声明为抽象不是更干净吗? 成为具体班级的原因是什么?
...我们永远不会直接使用此类...
尽管主要通过从其派生类型并向其添加其他基于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
表并插入了一行。 由于它本身具有完全的功能,因此没有理由阻止人们选择使用它。
只有做出此决定的人才能肯定地告诉您。 但是,请注意, DbContext
中没有子类必须提供的行为,因此,如果将其抽象化,那只是因为要防止直接使用它。 但是可以直接使用:
using (var ctx = new DbContext("EntityConnectionString")) {
var errors = ctx.Set<Error>().ToArray();
Console.WriteLine(errors.Length);
}
如果您传递实体连接字符串(或在app.config中指定其名称)-它可以从您的emdx模型构建模型(它也可以直接在其他情况下使用)。 这样,您可以像往常一样进行查询,保存更改等,而不是仅使用Set<T>
方法来声明DbSet
属性。
由于单独使用时它不会损坏-我看不出有太多理由通过抽象来防止这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.