我完成了。net MAUI应用程序的编码,在调试模式下一切都运行良好。我所有的数据持久性需求都被Xamarin的实体框架核心满足了,即使我在。net MAUI上使用它。
我已经制作了apk文件,并正在测试它,看看是否一切正常,但事实证明数据库没有被创建。当我尝试执行数据库操作时,应用程序崩溃了。所以我不确定它是否与。net MAUI不兼容(但它在调试中工作良好),或者我错过了一些东西。
我遵循这里访问的教程https://learn.microsoft.com/en-us/ef/core/get-started/xamarin下面是我的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}");
}
}
}
由于大量使用反射,Android/iOS链接器正在删除实体框架核心/Sqlite程序集的大块。你可以指示链接器保留一些重要的实体框架核心内容,如:
- 添加一个名为link . XML的XML文件到你的Android项目。 在解决方案资源管理器中右键单击link .xml,然后选择属性。
- 将Build Action更改为LinkDescription.
- 添加以下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链接器是不同的,它删除了实体框架依赖的一些属性。在这种情况下,你需要添加一个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文件记录在这里。
问题是链接器认为我的EntityFrameworkCore依赖关系是不需要的。它工作得有点太好了。
我在csproj文件中关闭了它,如下所示
<PropertyGroup>
<AndroidLinkMode>None</AndroidLinkMode>
</PropertyGroup>
我确实认为我应该使用<AndroidLinkSkip>Assembly1</AndroidLinkSkip>
来确保该程序集将被链接器跳过并包含在发布版本中。
这里是Xamarin链接器页面的链接器,它也与。net MAUI相关。https://learn.microsoft.com/en-us/xamarin/android/deploy-test/linker