- Регистрация
- 20.02.2021
- Сообщения
- 8
- Благодарностей
- 2
- Баллы
- 3
Приветствую! Такой вопрос, как заставить работать EF6, SQLite без App.config в ZP ?
Частично у меня это получилось реализовать, после прочтения этой темы я понял конкретную проблему и нашел вот такое решение. Все заработало, только в режиме отладки. После компиляции решения в .dll и запуска в ZP появилась такая ошибка "A null was returned after calling the 'get_ProviderFactory' method on a store provider instance of type 'System.Data.SqlClient.SqlConnection'. The store provider might not be functioning correctly."
Что я делаю:
1. Создаю проект PM.
2. Создаю экшен Visual Studio.
3. Создаю решение.
4. Добавляю библиотеку System.Data.SQLite через NuGet
5. Добавляю код для поддержки поставщика.
Файл Program.cs:
Файл Context.cs:
Когда тестирую в режиме отладки, работает все отлично. Пробую запустить через PM или ZP сразу выдает исключение при попытки загрузить базу данных.
Предполагаю что проблема находиться в коде поддержки поставщика и что-то там нужно поменять.
Подскажите, как заставить это работать в ZP?
Частично у меня это получилось реализовать, после прочтения этой темы я понял конкретную проблему и нашел вот такое решение. Все заработало, только в режиме отладки. После компиляции решения в .dll и запуска в ZP появилась такая ошибка "A null was returned after calling the 'get_ProviderFactory' method on a store provider instance of type 'System.Data.SqlClient.SqlConnection'. The store provider might not be functioning correctly."
Что я делаю:
1. Создаю проект PM.
2. Создаю экшен Visual Studio.
3. Создаю решение.
4. Добавляю библиотеку System.Data.SQLite через NuGet
5. Добавляю код для поддержки поставщика.
Файл Program.cs:
Program.cs:
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Infrastructure.DependencyResolution;
using System.Data.SQLite;
using System.Data.SQLite.EF6;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary.ProjectModel;
namespace ZennoPosterProject
{
public class Program : IZennoExternalCode
{
public int Execute(Instance instance, IZennoPosterProjectModel project)
{
int executionResult = 0;
using (Context db = new Context($"Data Source={project.Directory}\\Database.db"))
{
db.Accounts.Load(); // <--- После компиляции появляется ошибка.
IList<Account> Accounts = db.Accounts.Local.ToBindingList();
}
return executionResult;
}
}
class SQLiteProviderInvariantName : IProviderInvariantName
{
public static readonly SQLiteProviderInvariantName Instance = new SQLiteProviderInvariantName();
private SQLiteProviderInvariantName() { }
public const string ProviderName = "System.Data.SQLite.EF6";
public string Name { get { return ProviderName; } }
}
class SQLiteDbDependencyResolver : IDbDependencyResolver
{
public object GetService(Type type, object key)
{
if (type == typeof(IProviderInvariantName)) return SQLiteProviderInvariantName.Instance;
if (type == typeof(DbProviderFactory)) return SQLiteProviderFactory.Instance;
if (type == typeof(IDbProviderFactoryResolver)) return SQLiteDbProviderFactoryResolver.Instance;
return SQLiteProviderFactory.Instance.GetService(type);
}
public IEnumerable<object> GetServices(Type type, object key)
{
var service = GetService(type, key);
if (service != null) yield return service;
}
}
class SQLiteDbConfiguration : DbConfiguration
{
public SQLiteDbConfiguration()
{
AddDependencyResolver(new SQLiteDbDependencyResolver());
}
}
class SQLiteDbProviderFactoryResolver : IDbProviderFactoryResolver
{
public static readonly SQLiteDbProviderFactoryResolver Instance = new SQLiteDbProviderFactoryResolver();
private SQLiteDbProviderFactoryResolver() { }
public DbProviderFactory ResolveProviderFactory(DbConnection connection)
{
if (connection is SQLiteConnection) return SQLiteProviderFactory.Instance;
if (connection is EntityConnection) return EntityProviderFactory.Instance;
return null;
}
}
}
Context.cs:
using System.Data.Entity;
namespace ZennoPosterProject
{
public class Context : DbContext
{
public Context(string connectionString) : base(connectionString) { }
public DbSet<Account> Accounts { get; set; }
}
}
Предполагаю что проблема находиться в коде поддержки поставщика и что-то там нужно поменять.
Подскажите, как заставить это работать в ZP?