Информация об изменениях

Сообщение Customization with assembly от 12.04.2023 8:25

Изменено 12.04.2023 8:57 Berill

Customization with assembly
Доброе время суток.

Столкнулся с проблемой при использовании 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 файл.

Буду благодарен, если объясните что я делаю не так.
Customization with assembly
Доброе время суток.

Столкнулся с проблемой при использовании 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

Может именно такая команда и имелась в виду в документации?!