.NET MAUI/Xamarin.Forms中的Entity Framework Core

12

我已完成编写我的.NET MAUI应用程序,并且在调试模式下一切都正常工作。即使我在.NET MAUI上使用它,我的所有数据持久性需求都得到Xamarin的Entity Framework Core满足。

我已经制作了apk文件并正在测试以查看是否一切正常,但事实证明数据库未被创建。一旦我尝试进行数据库操作,我的应用程序就会崩溃。因此,我不确定EF Core与.NET MAUI不兼容(但在调试时它可以正常工作)还是我漏掉了什么。

我按照这里访问的教程进行操作,以下是我的DataContext文件

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


如果您正在使用Code First,请确保使用Database.Migrate()或Database.MigrateAsync()而不是Database.EnsureCreated(),以便应用所有迁移。 - Nikola Develops
经过自己的研究,问题与链接器有关。它正在删除EntityFrameworkCore包。或者至少我是这么认为的。 - Tanaka Mawere
2个回答

15

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

  1. 在Android项目中添加名为Linker.xml的XML文件。
  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>

iOS链接器与其他平台不同,它会删除一些Entity Framework所依赖的属性。因此,你需要添加一个特定于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>

已验证可与Microsoft.EntityFrameworkCore.Sqlite版本5.0.17兼容。

LinkDescription XML文件的文档在此处记录。


你需要在库链接中选择哪个选项?只有SDK吗?如果我没记错,“不链接”选项会导致应用被拒绝? - ScottexBoy

1
问题出在链接器上,它认为我不需要 EntityFrameworkCore 依赖项。它的工作效果过于出色了。
我在 csproj 文件中将其关闭,如下所示:
    <PropertyGroup>
        <AndroidLinkMode>None</AndroidLinkMode>
    </PropertyGroup>

我认为我应该使用<AndroidLinkSkip>Assembly1</AndroidLinkSkip>来确保链接器跳过该程序集并将其包含在发布版本中。
这里有一个链接到Xamarin链接器页面,它也与.NET MAUI相关。 https://learn.microsoft.com/en-us/xamarin/android/deploy-test/linker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接