Я устанавливаю новое приложение Xamarin Forms (Android) с нуля и хочу реализовать базу данных SQLite с Entity Framework Core. Независимо от того, где я позволю EF Core создать базу данных, я получаю ошибку ввода-вывода диска SQLite 10 (расширенный код ошибки 266).
Примечание: (я уже создал приложения форм Xamarin с EF Core (SQLite), гдебаза данных может быть создана, так как я пытаюсь это сделать в этот раз, и никакой ошибки, как это произошло, не произошло)
Я пытался переместить весь связанный с EF код из UI-потока, чтобы быть уверенным, что пользовательский интерфейс-Тред не блокирует путь к папке с приложениями или что-то в этом роде.
Я пробовал разные пути для создания файла базы данных.
Создание асинхронной / не асинхронной базы данных с помощью ef core.
(я использую DI с Autofac) Я попытался удалить весь код, связанный с Autofac, и самостоятельно инициализировать необходимый DatabseContext.
Я убедился, что у меня есть все необходимые разрешения для записи в файл / чтения из файла в Android.
(6. Я такжепытался по-разному регистрировать мои зависимости, чтобыAutofac или DI, как правило, не проблема сгенерированной ошибки)
В моем Android-приложении MainActivity я считываю путь к базе данных и передаю его в приложение Xamarin.Forms, например:
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
string databasePath = Application.ApplicationContext.GetDatabasePath("target.db").AbsolutePath;
Я также создаю экземпляр AppSetup, который я использую для регистрации всех необходимых зависимостей с помощью autofac.
public AppSetup(string databasePath)
{
_databasePath = databasePath;
}
public IContainer CreateContainer()
{
var containerBuilder = new ContainerBuilder();
RegisterDependencies(containerBuilder);
return containerBuilder.Build();
}
protected virtual void RegisterDependencies(ContainerBuilder containerBuilder)
{
containerBuilder.RegisterType<TargetContext>().As<ITargetContext>().WithParameter("databasePath", _databasePath).SingleInstance();
containerBuilder.RegisterType<UnitOfWork>().As<IUnitOfWork>().SingleInstance();
containerBuilder.RegisterType<SettingsRepository>().As<ISettingsRepository>().SingleInstance();
}
После того, как все это сделано, я создаю файл базы данных какэто в моем App.xaml.cs:
// Register types and create container
AppContainer.Container = setup.CreateContainer();
// Begin lifetime scope of container
using var scope = AppContainer.Container.BeginLifetimeScope();
var context = scope.Resolve<ITargetContext>();
context.Initialize();
В context.Initialize () я позволил ядру EF создать базу данных (если она еще не создана), и именно здесь выдается исключение:
public bool Initialize()
{
bool result = Database.EnsureCreated();
return result;
}
Примечание. Конфигурация DatabaseContext:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Filename={_databasePath}");
base.OnConfiguring(optionsBuilder);
}
Я ожидаю, что ядро EF может создать файл базы данных SQLite без каких-либо проблем. Я искал решение этой ошибки в течение нескольких дней, но ничто не могло помочь мне решить эту ошибку.
PS: трассировка стека, которую я получаю с этой ошибкой:
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC (System.Int32 rc, SQLitePCL.sqlite3 db) [0x0006d] in <99138fe6fbac4a1b964cb2ae266abca2>:0
at Microsoft.Data.Sqlite.SqliteConnection.Open () [0x00130] in <99138fe6fbac4a1b964cb2ae266abca2>:0
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection (System.Boolean errorsExpected) [0x00068] in <f837de81a58c413490ebba0c6077cbc0>:0
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open (System.Boolean errorsExpected) [0x00042] in <f837de81a58c413490ebba0c6077cbc0>:0
at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteDatabaseCreator.Exists () [0x0000c] in <971e586a59454fdbaaa76f95799fac73>:0
at Microsoft.EntityFrameworkCore.Storage.RelationalDatabaseCreator.EnsureCreated () [0x00008] in <f837de81a58c413490ebba0c6077cbc0>:0
at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.EnsureCreated () [0x0000b] in <6f7983df5846436f8e9cb779867785c7>:0
at Target.ServiceLayer.TargetContext.Initialize () [0x00002] in C:\Users\Nicklas\Source\Repos\XFTarget\Target\Target\ServiceLayer\TargetContext.cs:28
РЕДАКТИРОВАТЬ (1): PS: я отлаживаю свое приложение на реальном устройстве, но другие примеры приложений ясозданные с помощью форм xamarin + ef core могут успешно создать свою базу данных на этом устройстве.