Entity Framework: почему DbContext является конкретным классом, а не абстрактным классом? - PullRequest
0 голосов
/ 16 мая 2018

Интересно, почему класс DbContext, который является базовым классом при использовании Entity Framework, является конкретным классом.

На самом деле мы никогда не используем этот класс напрямую, только наследуя его.

Не было бы чище объявить его абстрактным? Каковы причины того, чтобы это был конкретный класс?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Только люди, которые приняли это решение, могут сказать вам наверняка.Однако обратите внимание, что в DbContext отсутствует поведение, которое должно быть предоставлено дочерними классами, поэтому, если вы сделаете его абстрактным - это только потому, что вы хотите предотвратить его непосредственное использование.Но его можно использовать напрямую:

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

Если вы передадите строку соединения сущности (или имя ее в app.config) - она ​​может построить модель из вашей модели emdx (и этоможет использоваться непосредственно в других сценариях).При этом вы можете делать запросы, сохранять изменения и так далее, как обычно, вместо объявленных DbSet свойств, которые вы просто используете Set<T> метод.

Поскольку он не нарушается при использовании сам по себе - я не вижу особой причинычтобы предотвратить это, сделав его абстрактным.

0 голосов
/ 16 мая 2018

... мы никогда не используем этот класс напрямую ...

Несмотря на то, что преимущественно используется для извлечения типа из него и добавления к нему дополнительных свойств на основе 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; }
    }
}

Просто создал таблицу Foos в моей базе данных Flange и вставил строку. Поскольку он полностью функционален сам по себе, у нет причины запрещать людям использовать его подобным образом, если они захотят это сделать.

...