【问题标题】:Xamarin Forms +Entity Framework Core + SQLite - Calling migration on production breaks applicationXamarin Forms +Entity Framework Core + SQLite - 在生产中断应用程序上调用迁移
【发布时间】:2019-12-25 15:12:59
【问题描述】:

首先我运行以下设置

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();
}

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

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));
}

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

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

在 Android 设备监视器上查看时会显示很长的错误 开头是 稍后的某个地方列出了EnsureCreated 方法

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

【问题讨论】:

    标签: c# sqlite xamarin.forms entity-framework-core production-environment


    【解决方案1】:

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

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

    【讨论】:

    • 首先感谢您的回答和您的时间。当我关闭链接器时,该应用程序开始工作。 (“仅链接 sdk 程序集”)已被检查。但现在 apk 大约有 50 MB。你的最后一个想法对我不起作用,因为我收到一个错误,即 Preserve 需要两个 bool 类型的参数。
    • @canvee 那么这绝对是一个链接器问题。你对那行代码是对的,我刚刚检查了我的项目,我只在 iOS 上使用它。你可以试试这个方法而不是developer.intersoftsolutions.com/display/crosslight/…,看看结果如何?
    • 是的。该解决方案有效。你真棒!非常感谢!
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2017-10-27
    • 2020-06-19
    • 2017-04-26
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多