几年前,我发现了这种创建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();
答案 0 :(得分:1)
如果您使 DbContext 保持短命,并且不尝试对其进行缓存或过度重用实例,则此方法没有错。
但是,我个人觉得这有点冗长。对于内部应用程序,我倾向于将设置和连接字符串保留在app.config中,而仅使用using
语句。
using(var db = new MyContext())
{
var lotsOfStuff = db.SomeTable.Where(x => x.IsAwesome);
//
}
话虽如此,实际上您只需要遵守一些规则(这不是一个自以为是的答案)
更新
也许我误会了一些东西,但是如果我将更改保存到 数据库经常发生,那么我的方法不好吗?小 更改时会更新事物,而不是大数据 到处都是
这取决于您将DefaultDbContext
保持打开状态的时间,我的意思是,如果仅对几个查询年份来说,这样就可以了。
上下文被设计为可以很快地打开和关闭,它们并不是为了长时间保持打开和运行而设计的。这样做有时会给您带来更多的问题。
经常保存到数据库虽然很有意义,但实际上并不是问题所在。