【问题标题】:Error using EntityFramework Core with SQLite in Xamarin.iOS在 Xamarin.iOS 中使用带有 SQLite 的 EntityFramework Core 时出错
【发布时间】:2019-08-08 05:17:01
【问题描述】:

我在物理设备上使用带有 SQLite 的 EntityFrameworkCore 时遇到问题。它在 iPhone xR 模拟器上没有任何问题,但在 iPhone 6 模拟器或物理设备上却没有。但据我所知,它在 Android 上运行良好。

问题在于,当调用 EnsureCreatedAsync() 方法时,应用程序崩溃了(它甚至没有展开到我已经捕获的问题),并出现以下错误:

在屏幕截图中,此方法在上下文的构造函数中被调用,尽管我尝试将其移动到异步方法并等待它,但会出现同样的问题。这是我的上下文的代码:

public class Database : DbContext
    {
        public Database()
        {
            try
            {
                Database.EnsureCreatedAsync();
            }
            catch (Exception ex)
            {
                Debug.Write(ex.Message);
            }
        }

        public DbSet<TextRecordModel> TextRecords { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);

            String databasePath = "";
            switch (Device.RuntimePlatform)
            {
                case Device.iOS:
                    SQLitePCL.Batteries_V2.Init();
                    databasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "Library", "TestDB.db");
                    break;
                case Device.Android:
                    databasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "TestDB.db");
                    break;
                default:
                    throw new NotImplementedException("Platform not supported");
            }

            optionsBuilder.UseSqlite($"Filename={databasePath}");

        }        

        public async Task<bool> SaveTextRecordAsync(TextRecordModel record)
        {
            try
            {
                await TextRecords.AddAsync(record);
                await SaveChangesAsync();
                return true;
            }
            catch
            {
                return false;
            }
        }

        public async Task<List<TextRecordModel>> GetTextRecordsAsync()
        {
            return await TextRecords.ToListAsync();
        }
    }

我也将整个项目放到了 Github 上,the code is here,以防有人想看。

我正在运行 Xamarin Forms 4.1 和 Microsoft.EntityFrameworkCore.Sqlite 2.2.6。为了排除链接器问题,我将链接器行为设置为“不链接”,但这没有任何区别。我还尝试在此之前添加一行以将一个小文本文件写入数据库位置,以排除任何文件系统或权限问题,这没有问题。

我无法在设备日志中找到任何错误,但在调试模式下运行时从堆栈跟踪中得到以下信息:

2019-08-16 07:08:01.337 SQLiteTest.iOS[32921:2851415] error: Failed to load AOT module 'data-0x112ed8000.so' in aot-only mode.

=================================================================
    Native Crash Reporting
=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

=================================================================
    Basic Fault Adddress Reporting
=================================================================
Memory around native instruction pointer (0x1941610cc):0x1941610bc  fd 7b c1 a8 c0 03 5f d6 10 29 80 d2 01 10 00 d4  .{...._..)......
0x1941610cc  c3 00 00 54 fd 7b bf a9 fd 03 00 91 3f d5 ff 97  ...T.{......?...
0x1941610dc  bf 03 00 91 fd 7b c1 a8 c0 03 5f d6 90 29 80 d2  .....{...._..)..
0x1941610ec  01 10 00 d4 c3 00 00 54 fd 7b bf a9 fd 03 00 91  .......T.{......

=================================================================
    Native stacktrace:
=================================================================
    0x105f84d18 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x105f7b1d8 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x1941d44f0 - /usr/lib/system/libsystem_platform.dylib : <redacted>
    0x1941d8a88 - /usr/lib/system/libsystem_pthread.dylib : pthread_kill
    0x1940ba14c - /usr/lib/system/libsystem_c.dylib : abort
    0x1060f3e0c - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : xamarin_find_protocol_wrapper_type
    0x1060d3f34 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x1060d3f84 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f61a90 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x105fb72b8 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105fb3104 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105fee7b0 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x100b1b094 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x100b1b1c4 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x100b1b158 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x100b1af7c - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x100ca988c - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x10129d2bc - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x105f8bc84 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x10602e450 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f9767c - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f96b44 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f96c84 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f96c84 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f9c600 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f95610 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105fadd70 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f941f8 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x1013102b4 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x1009ccabc - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x10129d2bc - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x105f8bc84 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x10602ca98 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x1060320e4 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : mono_pmip
    0x105f701a0 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x106103628 - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : xamarin_localized_string_format_9
    0x1009cc9cc - /var/containers/Bundle/Application/06702566-C641-4954-A671-29967CE5DF53/SQLiteTest.iOS.app/SQLiteTest.iOS : (null)
    0x194014fd8 - /usr/lib/system/libdyld.dylib : <redacted>

=================================================================
    Managed Stacktrace:
=================================================================
      at <unknown> <0xffffffff>
      at System.AppDomain:LoadAssemblyRaw <0x00007>
      at System.AppDomain:Load <0x00053>
      at System.AppDomain:Load <0x00047>
      at System.AppDomain:Load <0x0003b>
      at System.Reflection.Assembly:Load <0x0003b>
      at System.Object:runtime_invoke_dynamic <0x0011b>
      at <unknown> <0xffffffff>
      at SQLiteTest.iOS.Application:Main <0x0006b>
      at System.Object:runtime_invoke_dynamic <0x0011b>
=================================================================

这可能是什么原因造成的,解决办法是什么?

【问题讨论】:

  • 你更新iOS或IDE的版本了吗?您可以删除iOS项目中的文件夹bin和obj,然后清理并重建它。
  • 据我所知,我随后在所有项目中升级了 Xamarin.Forms 的版本(以解决不同的问题),现在问题似乎已经消失了......?跨度>
  • 否定,问题没有消失。
  • 清理和重建使该错误消失。但现在我不断得到价值不能为空。参数名称:调用 EnsureCreatedAsync 时的键
  • 请阅读this。没有外部链接,问题应该是可以理解的。大多数用户(包括我)都不会对在 github 上仔细检查一个完整的项目感兴趣,即使它很小,更不用说尝试运行它了,可能缺少一些必需的依赖项。从问题文本中应该可以清楚地看出失败代码在何时何地运行。

标签: sqlite xamarin xamarin.forms xamarin.ios entity-framework-core


【解决方案1】:

这个问题是由 EntityFrameworkCore 中的 open issue 引起的。 As a workaround,EFCore SQLite 2.2.6 与 Xamarin.Forms 3.6 一起使用,或者 EFCore SQLite 2.1.0 与 Xamarin.Forms 4.1 一起使用。在任何一种情况下,根据上述问题,需要引导链接器以保留 EFCore 依赖项。这可以通过在 IOS 项目的 Main.cs 中添加指令来完成:

[assembly: Preserve (typeof (System.Linq.Queryable), AllMembers = true)]

【讨论】:

  • 如果这不起作用,请检查here
猜你喜欢
  • 2019-01-15
  • 2015-10-20
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多