繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM