Должен ли я использовать здесь выражение «использование» или оставить его как есть? - PullRequest
0 голосов
/ 29 декабря 2018

Я обнаружил этот способ создания экземпляров DbContext несколько лет назад и лишь немного обновил его.Мой код работает, но мне интересно, не вызовет ли он каких-либо проблем в будущем.Мой вопрос заключается в том, должен ли я использовать выражение "using" для своих контекстных вызовов или оставить его как есть?

Это для RAGEMP, модификации GTAV.Сервер синхронизирует игроков и при необходимости обращается к базе данных MySQL.

public class DefaultDbContext : DbContext
{
    public DefaultDbContext(DbContextOptions options) : base(options)
    {

    }

    // Accounts table
    public DbSet<Account> Accounts { get; set; }

}

public class ContextFactory : IDesignTimeDbContextFactory<DefaultDbContext>
{
    private static DefaultDbContext _instance;

    public DefaultDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<DefaultDbContext>();

        builder.
            UseMySql(@"Server=localhost;
                    database=efcore;
                    uid=root;
                    pwd=;",
                optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(DefaultDbContext).GetTypeInfo().Assembly.GetName().Name));

        return new DefaultDbContext(builder.Options);
    }

    public static DefaultDbContext Instance
    {
        get
        {
            if (_instance != null) return _instance;

            return _instance = new ContextFactory().CreateDbContext(new string[] { });
        }
        private set { }
    }

// где-то еще

        // create a new Account object
        var account = new Account
        {
            Username = "test",
            Password = "test"
        };

        // Add this account data to the current context
        ContextFactory.Instance.Accounts.Add(account);

        // And finally insert the data into the database
        ContextFactory.Instance.SaveChanges();

1 Ответ

0 голосов
/ 29 декабря 2018

В этом подходе нет ничего плохого, если вы сохраняете ваш DbContext недолговечным и не пытаетесь их кэшировать или чрезмерно повторно использовать экземпляр.

Однако лично я нахожу это немногоподробный.Для внутренних приложений я обычно храню строки настройки и подключения в app.config и просто использую оператор using.

using(var db = new MyContext())
{
    var lotsOfStuff = db.SomeTable.Where(x => x.IsAwesome);
    //
}

Сказав, что на самом деле есть только несколько правил, которые вы должны соблюдать (без этого самоуверенного ответа)

  1. Не пытайтесь чрезмерно использовать DbContext .Они внутренне кэшируются, и при их создании и закрытии возникают незначительные накладные расходы.
  2. Не пытайтесь без необходимости скрывать все за слоями абстракций.
  3. Всегда сначала кодируйте для удобства чтения и поддержки,если у вас нет необходимости кодировать производительность.

Обновление

Возможно, я что-то неправильно понимаю, но если я чаще сохраняю изменения в базе данных, то плох ли мой подход?Мелочи обновляются, когда что-то меняется, не большой кусок данных тут и там

Это зависит от того, как долго вы открываете свой DefaultDbContext, я имею в виду, если это только на пару запросов в годВсе в порядке.

Контекст предназначен для открытия и закрытия довольно быстро, он не предназначен для того, чтобы оставаться открытым и живым в течение длительных периодов времени.Это иногда вызывает у вас больше проблем, чем нет.

Часто сохранение в базу данных, хотя и имеет смысл, но это не проблема.

...