.NET MAUI/Xamarin.Forms 中的实体框架核心

Tan*_*ere 12 sqlite xamarin.forms entity-framework-core maui .net-maui

我完成了 .NET MAUI 应用程序的编码,并且在调试模式下一切正常。尽管我在 .NET MAUI 上使用它,但 Xamarin 的 Entity Framework Core 满足了我所有的数据持久性需求。

我已经制作了 apk 文件并对其进行测试以查看是否一切正常,但结果发现数据库并未创建。一旦我尝试执行数据库操作,我的应用程序就会崩溃。所以我不确定 EF Core 与 .NET MAUI 是否不兼容(但它在调试中运行良好),或者我错过了一些东西。

我按照此处访问的教程进行操作https://learn.microsoft.com/en-us/ef/core/get-started/xamarin下面是我的 DataContext 文件

数据上下文.cs

using Microsoft.EntityFrameworkCore;
using MedbaseRec.Models;

namespace MedbaseRec.Utils
{
    public class DataContext : DbContext
    {
        public DbSet<QuestionPack> QuestionPacks { get; set; }
        public DbSet<Question> Questions { get; set; }

        public DataContext()
        {
            SQLitePCL.Batteries_V2.Init();

            Database.EnsureCreated();
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string dbPath = Path.Combine(FileSystem.AppDataDirectory, "medbaseapplica.db3");
            optionsBuilder.UseSqlite($"Filename={dbPath}");
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

Tre*_*com 15

由于大量使用反射,Android/iOS 链接器正在删除 Entity Framework Core / Sqlite 程序集的块。您可以指示链接器保留一些重要的 Entity Framework Core 内容,如下所示:

  1. 将名为 Linker.xml 的 XML 文件添加到您的 Android 项目中。
  2. 在解决方案资源管理器中右键单击 Linker.xml,然后选择“属性”。
  3. 将构建操作更改为 LinkDescription。
  4. 添加以下 XML:
<?xml version="1.0" encoding="utf-8" ?>
<linker>
    <!-- Entity Framework Core -->
    <assembly fullname="mscorlib">
        <type fullname="System.String">
            <method name="Compare"></method>
            <method name="CompareTo"></method>
            <method name="ToUpper"></method>
            <method name="ToLower"></method>
        </type>
    </assembly>
    <assembly fullname="System.Core" />
    <assembly fullname="Microsoft.EntityFrameworkCore" />
    <assembly fullname="Microsoft.EntityFrameworkCore.Sqlite" />
    <assembly fullname="Microsoft.EntityFrameworkCore.Relational" />
    <assembly fullname="SQLitePCLRaw.core" />
    <assembly fullname="SQLitePCLRaw.batteries_v2" />
    <assembly fullname="SQLitePCLRaw.lib.e_sqlite3.android" />
</linker>
Run Code Online (Sandbox Code Playgroud)

iOS 链接器有所不同,它删除了实体框架依赖的一些属性。在这种情况下,您需要添加 iOS 特定的链接器扩展:

<?xml version="1.0" encoding="utf-8" ?>
<linker>
    <!-- Entity Framework Core -->
    <assembly fullname="mscorlib">
        <type fullname="System.String">
            <method name="Compare"></method>
            <method name="CompareTo"></method>
            <method name="ToUpper"></method>
            <method name="ToLower"></method>
        </type>
        <type fullname="System.Reflection.AssemblyInformationalVersionAttribute" preserve="all" />
    </assembly>
    <assembly fullname="System.Core" />
    <assembly fullname="Microsoft.EntityFrameworkCore" />
    <assembly fullname="Microsoft.EntityFrameworkCore.Sqlite" />
    <assembly fullname="Microsoft.EntityFrameworkCore.Relational" />
    <assembly fullname="SQLitePCLRaw.core" />
    <assembly fullname="SQLitePCLRaw.batteries_v2" />
    <assembly fullname="SQLitePCLRaw.lib.e_sqlite3.ios" />
</linker>
Run Code Online (Sandbox Code Playgroud)

这已被验证可以针对 Microsoft.EntityFrameworkCore.Sqlite 版本 5.0.17 运行。

LinkDescription XML 文件记录在此处