Доброе время суток.
Столкнулся с проблемой при использовании linq2db.cli для генерации моделей данных.
Все делаю как описано тут (
https://linq2db.github.io/articles/CLI.html).
Пробую вариант кастомизации с отдельным assembly. Создал отдельный проект библиотеки (TargetFramework netcoreapp3.1).
| | Lib csproj |
| | <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>9</LangVersion>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="linq2db.Tools" Version="5.1.1" />
</ItemGroup>
</Project>
|
| | |
Добавил "пустой" Interceptor
| | Код |
| | public class MyScaffoldInterceptor : ScaffoldInterceptors
{
private ScaffoldOptions Options { get; }
public MyScaffoldInterceptor(ScaffoldOptions options)
{
this.Options = options;
}
}
|
| | |
Компиляция успешная, все нужные файлы в "bin\Debug\netcoreapp3.1" есть, включая
DataModelsCustomization.deps.json. Идем дальше.
Создал консольное приложение, добавил
Project Reference на библиотеку с кастомизациями.
| | App csproj |
| | <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>9</LangVersion>
</PropertyGroup>
<ItemGroup>
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="linq2db" Version="5.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DataModelsCustomization\DataModelsCustomization.csproj" />
</ItemGroup>
</Project>
|
| | |
Создал каталог DataModels внутри проекта консольного приложения. Поместил туда
database.json файл
| | database.json |
| | {
"general": {
"provider": "SqlServer",
"connection": "<my-connection-string>",
"overwrite": true
}
}
|
| | |
В терминале выполняю команду:
D:\PROJECTS\Examples\Linq2Db.NetCore\Linq2Db.NetCore\DataModels> dotnet linq2db scaffold -i database.json --customize ..\bin\Debug\netcoreapp3.1\DataModelsCustomization.dll
В результате получаю ошибку:
AssemblyResolve path: D:\PROJECTS\Examples\Linq2Db.NetCore\Linq2Db.NetCore\bin\Debug\netcoreapp3.1
Unhandled exception: DependencyContext.Load cannot load interceptor assembly
at LinqToDB.CommandLine.ScaffoldCommand.SetupInterceptorsDependencyResolver(String assemblyFolder, Assembly interceptorsAssembly)
at LinqToDB.CommandLine.ScaffoldCommand.LoadInterceptorsFromAssembly(String assemblyPath, ScaffoldOptions options)
at LinqToDB.CommandLine.ScaffoldCommand.LoadInterceptors(String interceptorsPath, ScaffoldOptions options)
at LinqToDB.CommandLine.ScaffoldCommand.Execute(CliController controller, String[] rawArgs, Dictionary`2 options, IReadOnlyCollection`1 unknownArgs)
at LinqToDB.CommandLine.CliController.Execute(String[] args)
at LinqToDB.Tools.Program.Main(String[] args)
В каталоге "bin\Debug\netcoreapp3.1" нет только одного файла:
DataModelsCustomization.deps.json.
Как только я его копирую
вручную из каталога куда складывается результат сборки библиотеки "DataModelsCustomization\bin\Debug\netcoreapp3.1", все проходит успешно, модели генерируются. Пока что никак не могу найти способа его автоматического копирования при сборке проекта.
Пробовал добавлять "<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>" в файл проекта приложения, не помогло.
Можно конечно выполнить терминальную команду, находясь в каталоге библиотеки
D:\PROJECTS\Examples\Linq2Db.NetCore\DataModelsCustomization> dotnet linq2db scaffold -i database.json --customize bin\Debug\netcoreapp3.1\DataModelsCustomization.dll
Но я хочу, чтобы модели данных были в проекте приложения. Или действительно надо генерировать модели в проекте с кастомизациями? В документации (
https://linq2db.github.io/articles/CLI.html) об этом ничего не сказано.
Как вариант, еще можно добавить поле
output в json файл.
Буду благодарен, если объясните что я делаю не так.
UPD:
Убрал Project Reference на библиотеку с кастомизацией и выполнил команду
dotnet linq2db scaffold -i database.json --customize ..\..\DataModelsCustomization\bin\Debug\netcoreapp3.1\DataModelsCustomization.dll
Может именно такая команда и имелась в виду в документации?!
Здравствуйте, Berill, Вы писали:
B>Создал консольное приложение, добавил Project Reference на библиотеку с кастомизациями.
B>B> <ProjectReference Include="..\DataModelsCustomization\DataModelsCustomization.csproj" />
B>
B>В терминале выполняю команду:
B>B>D:\PROJECTS\Examples\Linq2Db.NetCore\Linq2Db.NetCore\DataModels> dotnet linq2db scaffold -i database.json --customize ..\bin\Debug\netcoreapp3.1\DataModelsCustomization.dll
B>
B>В результате получаю ошибку:
B>B>AssemblyResolve path: D:\PROJECTS\Examples\Linq2Db.NetCore\Linq2Db.NetCore\bin\Debug\netcoreapp3.1
B>Unhandled exception: DependencyContext.Load cannot load interceptor assembly
B>В каталоге "bin\Debug\netcoreapp3.1" нет только одного файла: DataModelsCustomization.deps.json.
Проблема понятна.
Мы используем два варианта загрузки интерцептора из dll:
— если есть .deps.json файл : загружаем через DependencyContext.Load, который использует deps.json для поиска зависимостей
— если файла зависимостей нет то дополнительные зависимости ищутся в той же папке где и сборка с интерцептором
В данном случае так как зачем-то проект интерцептора сбилжен через ProjectReference, то deps.json не от него и вызов DependencyContext.Load обламывается. В принципе наша ошибка, надо имя файла более строго проверять.
Но в целом надо было сбилдить интерцептор отдельно, как было сделано ниже.
B>Как только я его копирую вручную из каталога куда складывается результат сборки библиотеки "DataModelsCustomization\bin\Debug\netcoreapp3.1", все проходит успешно, модели генерируются. Пока что никак не могу найти способа его автоматического копирования при сборке проекта.
Не очень понятно зачем его вообще подключать референсом, я сомневаюсь что вы планируете код из него в основном проекте использовать. Но если всё-же надо, то можно добавить post-build команду в проект.
B>Можно конечно выполнить терминальную команду, находясь в каталоге библиотеки
B>Но я хочу, чтобы модели данных были в проекте приложения. Или действительно надо генерировать модели в проекте с кастомизациями?
B>Как вариант, еще можно добавить поле output в json файл.
Ну мы не ограничиваем пользователя местом где генерировать. output для этого и сделан.
B>UPD:
B>Убрал Project Reference на библиотеку с кастомизацией и выполнил команду
B>dotnet linq2db scaffold -i database.json --customize ..\..\DataModelsCustomization\bin\Debug\netcoreapp3.1\DataModelsCustomization.dll
B>Может именно такая команда и имелась в виду в документации?!
именно