MAUI iOS EntityFramework Core - 在发布 iOS 版本中未创建数据库

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

我正在开发的应用程序成功在 Android 或 iOS 模拟器上创建 SQLite DB 并填充初始数据,但在真实设备上发布 iOS 版本却没有任何数据。

我正在使用 Entity Framework Core 最初我使用 SQLite Nuget 包。切换到 EF 后,我清理了所有内容 - 删除了所有相关的软件包,只添加了 EF 及其 Nuget 附带的软件包。

我创建了一个上下文类

internal class MyDbContext : DbContext
{
    public MyDbContext() 
    {
        SQLitePCL.Batteries_V2.Init();

        this.Database.EnsureCreated();
    }

    public DbSet<Entity1> Entities1 { get; set; }
    public DbSet<Entity2> Entities2 { get; set; }
    public DbSet<Entity3> Entities3 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyDatabase.db3");

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

制作了一个基本控制器类

internal abstract class ControllerBase<T> where T : IDBItem, new()
{
    protected IMapper _mapper;

    /// <summary>
    /// Use only in case of unavoidable execution of raw sql
    /// </summary>
    protected MyDbContext GetContext() => new MyDbContext();

    public ControllerBase() 
    {
        var config = new MapperConfiguration(cfg => {
            cfg.AddProfile<DefaultMappingProfile>();
        });
        _mapper = config.CreateMapper();
    }
}

数据库项目如下所示:

[PrimaryKey("Id")]
public class Entity1: IDBItem
{   
    public int Id { get; set; }

    public string Name { get; set; }

    public float SomeField { get; set; }
}

因此,每当从继承类获取上下文时,都会检查数据库是否已创建。在 Android 上这是可行的。 在 iOS 的发布模式下,我没有看到任何数据库条目。 不过,我确实在模拟器上看到了一些条目。这让我更加困惑。 任何人都可以建议一个解决方案吗?

我尝试清理 Nuget 包,因为最初我使用 SQLite PCL 包。删除所有 SQLite 并仅安装 EF Core 及其拉取的那些并不能解决问题。

entity-framework maui maui-ios ios-sqlite
1个回答
0
投票

经过大量挖掘,我发现该错误是由“在仅 aot 模式下运行时尝试 JIT 编译方法 InitializeComponent”引起的 它仅发生在设备的发布模式下。 该问题是由于项目文件内缺少 if 标签

<UseInterpreter>true</UseInterpreter>
引起的。最终它看起来像这样:

<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net7.0-ios|AnyCPU'">
  [other option shere]
  <MtouchLink>SdkOnly</MtouchLink>
  <MtouchUseLlvm>False</MtouchUseLlvm>
  <UseInterpreter>true</UseInterpreter>
</PropertyGroup>

原始问题链接:https://github.com/xamarin/xamarin-macios/issues/17194

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