我应该在这里使用“使用”语句还是保留原样?

时间:2018-12-29 02:35:56

标签: c# ef-core-2.0

几年前,我发现了这种创建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 :(得分:1)

如果您使 DbContext 保持短命,并且不尝试对其进行缓存或过度重用实例,则此方法没有错。

但是,我个人觉得这有点冗长。对于内部应用程序,我倾向于将设置和连接字符串保留在app.config中,而仅使用using语句。

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

话虽如此,实际上您只需要遵守一些规则(这不是一个自以为是的答案)

  1. 不要尝试过度使用 DbContext 。它们是内部缓存的,创建和关闭它们几乎没有开销。
  2. 不要试图不必要地将所有内容隐藏在抽象层后面。
  3. 始终始终先编写代码以提高可读性和可维护性,除非您需要编写代码以提高性能。

更新

  

也许我误会了一些东西,但是如果我将更改保存到   数据库经常发生,那么我的方法不好吗?小   更改时会更新事物,而不是大数据   到处都是

这取决于您将DefaultDbContext保持打开状态的时间,我的意思是,如果仅对几个查询年份来说,这样就可以了。

上下文被设计为可以很快地打开和关闭,它们并不是为了长时间保持打开和运行而设计的。这样做有时会给您带来更多的问题。

经常保存到数据库虽然很有意义,但实际上并不是问题所在。