Xamarin Forms +Entity Framework Core + SQLite - 在生产中断应用程序上调用迁移

can*_*vee 5 c# sqlite production-environment xamarin.forms entity-framework-core

首先,我运行以下设置

Xamarin Forms - Entity Framework Core 2.2 - SQLite - Android - DEBUG

一切正常。.db 文件正确生成,查询在数据库上执行。然后我准备了用于生产的应用程序,我将DEBUG更改为RELEASE编译,并打包成一个apk。安装在设备上时,应用程序总是在调用Database.Migrate()或调用时崩溃Database.EnsureCreated()

我尝试过的每个应用程序的场景都是一样的。应用程序在模拟器和处于调试模式的设备上正常运行。创建数据库时,应用程序在每个 Android 设备上崩溃。

这是实例化 DbContext

public ItemContext(DbContextOptions<ItemContext> options)
    : base(options)
{
    //Database.Migrate();
    Database.EnsureCreated();
}
Run Code Online (Sandbox Code Playgroud)

这就是构造函数的调用方式

public void Load()
{
    string databasePath = DependencyService.Get<ILocalFileStorageService>().GetDatabaseFilePath("ItemSQLite.db");

    string connectionString = $"Filename={databasePath}";
    DbContextOptions<ItemContext> options = new DbContextOptionsBuilder<ItemContext>()
            .UseSqlite(connectionString)
            .Options;

    dataService = new DataService(new ItemContext(options));
}
Run Code Online (Sandbox Code Playgroud)

这就是我在 Android 上检索文件路径的方式。

public string GetDatabaseFilePath(string fileName)
{
    string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    return Path.Combine(path, fileName);
}
Run Code Online (Sandbox Code Playgroud)

在 Android 设备监视器上查看时会显示很长的错误 开头是 错误消息第 1 部分 稍后某处EnsureCreated列出了方法 错误信息第 2 部分

问题:为什么会发生这种情况以及如何使应用程序可在生产环境中运行?

Geo*_*rge 5

您是否在发布构建配置中启用了链接?根据这个https://github.com/aspnet/EntityFrameworkCore/issues/10963,编译器需要提示不要链接通过 EF Core 内部反射访问的程序集。您可以尝试切换到“仅链接 sdk 程序集”以查看是否可以解决问题。如果是,那么您将需要识别程序集并将它们标记为要保留。这里有更多信息:Xamarin iOS 链接器问题和这里:https : //docs.microsoft.com/en-us/xamarin/android/deploy-test/linker#linkskip

我目前无法亲自测试,但我认为将[assembly: Preserve (typeof (System.Linq.Queryable), AllMembers = true)](或可能导致它的任何程序集)放入您的 App.xaml.cs 应该这样做。