EF6, SQLite не могу подключиться к базе данных в ZP 7.5.0.0

pro100dex

Client
Регистрация
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:
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:
Context.cs:
using System.Data.Entity;

namespace ZennoPosterProject
{
    public class Context : DbContext
    {
        public Context(string connectionString) : base(connectionString) { }
        public DbSet<Account> Accounts { get; set; }
    }
}
Когда тестирую в режиме отладки, работает все отлично. Пробую запустить через PM или ZP сразу выдает исключение при попытки загрузить базу данных.
Предполагаю что проблема находиться в коде поддержки поставщика и что-то там нужно поменять.
Подскажите, как заставить это работать в ZP?
 

pro100dex

Client
Регистрация
20.02.2021
Сообщения
8
Благодарностей
2
Баллы
3
Если в Program.cs убрать часть кода для NET4.0, то также в отладке все работает отлично, но теперь выдает следующую ошибку:
Message: An exception occurred while initializing the database. See the InnerException for details.
InnerException: System.Data.Entity.Core.ProviderIncompatibleException: CreateDatabase is not supported by the provider.
в System.Data.Entity.Core.Common.DbProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection)
в System.Data.Entity.Internal.DatabaseOperations.Create(ObjectContext objectContext)
в System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext)
в System.Data.Entity.Database.Create(DatabaseExistenceState existenceState)
в System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context)
в System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)


Файл 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;
            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());
        }
    }
}
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

pro100dex

Client
Регистрация
20.02.2021
Сообщения
8
Благодарностей
2
Баллы
3
А баг то в чем ? Какой заявленный функционал зенки не работает как надо ?
Я уже нашел решение данной проблемы. Все что нужно было сделать, так это переместить все файлы библиотеки SQLite (включая папки x64, x86) в папку проекта ZP и тогда все будет работать как надо. Проблема была в компиляции через PM, только часть файлов нужной библиотеки отправлялась к созданному dll, поэтому сыпались ошибки.

Не могу это назвать багом, но на то что бы найти источник проблемы, мне понадобилось несколько часов.
 
  • Спасибо
Реакции: seoputnik

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

pro100dex

Client
Регистрация
20.02.2021
Сообщения
8
Благодарностей
2
Баллы
3

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Перенёс тему из "Багов" в "Вопросы и обсуждения".
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
253
Баллы
63
Я уже нашел решение данной проблемы. Все что нужно было сделать, так это переместить все файлы библиотеки SQLite (включая папки x64, x86) в папку проекта ZP и тогда все будет работать как надо. Проблема была в компиляции через PM, только часть файлов нужной библиотеки отправлялась к созданному dll, поэтому сыпались ошибки.

Не могу это назвать багом, но на то что бы найти источник проблемы, мне понадобилось несколько часов.
можете чуть подробней пожалуйста?
я перенес зенку с одного сервера на другой. все настройки перенес, и вот в конце наткнулся на то что зенка с базами локальными (которые открываю через sqlite не заводится)
ес-но как ставил и настраивал уже не помню (было много лет тому назад)
понять бы как восстановить
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
можете чуть подробней пожалуйста?
я перенес зенку с одного сервера на другой. все настройки перенес, и вот в конце наткнулся на то что зенка с базами локальными (которые открываю через sqlite не заводится)
ес-но как ставил и настраивал уже не помню (было много лет тому назад)
понять бы как восстановить
ExternalAssemblies тоже перенес ?
 
  • Спасибо
Реакции: Rimen

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
253
Баллы
63

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)