在UWP应用程序中使用EF Core优化与SQLite DB的连接

问题描述 投票:0回答:1

我目前正在开发一个在ARM处理器上运行在Windows 10 IoT核心操作系统上的C#UWP应用程序。对于这个应用程序,我使用SQLite DB作为我的持久性,使用Entity Framework Core作为我的ORM。

我创建了自己的DBContext并在启动时调用Migrate函数创建了我的DB。我还可以在我的主逻辑中成功创建一个DBContext实例,该实例可以使用该模型成功读/写数据。到目前为止都很好。

但是,我注意到为每次与DB的交互创建DbContext的性能非常缓慢。虽然我可以保证只有我的应用程序访问数据库(我在具有受控软件环境的自定义硬件上运行),但我的应用程序中有多个线程需要通过DbContext访问数据库。

我需要找到一种方法来优化与我的SQLite数据库的连接,这种方式在我的应用程序中是线程安全的。正如我之前提到的,我不必担心任何外部应用程序。

首先,我尝试在外部创建一个SqliteConnection对象,然后将其传递给我创建的每个DbContext:

_connection = new SqliteConnection(@"Data Source=main.db");

...然后将其提供给我的DbContext并在OnConfiguring覆盖中使用:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlite(_connection);
}

...然后在我的应用程序中使用DbContext,如下所示:

using (var db = new MyDbContext())
{
    var data = new MyData { Timestamp = DateTime.UtcNow, Data = "123" };
    db.MyData.Add(data);
    db.SaveChanges();
}
// Example data read
MyDataListView.ItemsSource = db.MyData.ToList();

采用上述方法,我注意到当DbContext被释放时,连接会自动关闭,而不管连接是在外部创建的。因此,第二次使用连接创建DbContext时,最终会抛出异常。

其次,我尝试静态创建一个DbContext并在整个应用程序中共享它。因此,我没有在上面的using语句中创建DbContext,而是尝试了以下方法:

// Where Context property returns a singleton instance of MyDbContext
var db = MyDbContextFactory.Context;
var data = new MyData { Timestamp = DateTime.UtcNow, Data = "123" };
db.MyData.Add(data);
db.SaveChanges();

这为我提供了我希望的性能改进,但我很快意识到这不是线程安全的,更广泛的阅读已经证实我不应该这样做。

那么在使用EF Core和多线程UWP应用程序的情况下访问SQLite DB时,有没有人对如何提高性能有任何建议?提前谢谢了。

sqlite uwp dbcontext ef-core-2.0
1个回答
0
投票

其次,我尝试静态创建一个DbContext并在整个应用程序中共享它。因此,我没有在上面的using语句中创建DbContext,而是尝试了以下内容......这为我提供了我希望的性能改进,但我很快意识到这不是线程安全的,更广泛的阅读已经证实我不应该这样做这个。

我不知道为什么我们不应该这样做。也许你可以分享你读到的东西。但我认为,你可以使DBContext对象全局和静态,当你想做CRUD时,你可以在主线程中这样做:

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
    //App.BloggingDB is the static global DBContext defined in App class 
    var blog = new Blog { Url = NewBlogUrl.Text };
    App.BloggingDB.Add(blog);
    App.BloggingDB.SaveChanges();
});

但是请在适当的时候处理DBContext,因为它不会自动处理掉。

© www.soinside.com 2019 - 2024. All rights reserved.