Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Powershell Cmdlet中使用实体框架核心?_C#_Powershell_Entity Framework Core_Cmdlets - Fatal编程技术网

C# 在Powershell Cmdlet中使用实体框架核心?

C# 在Powershell Cmdlet中使用实体框架核心?,c#,powershell,entity-framework-core,cmdlets,C#,Powershell,Entity Framework Core,Cmdlets,是否可以构建包含实体框架(Core或EF6)的PowerShell cmdlet以访问SQL Server数据库 多年来,我一直在用C#编写cmdlet,但最近几天,由于程序集版本冲突,我在项目中尝试使用实体框架时经历了一场噩梦 该项目有三个库: MyProject.Commands.dll-要加载的cmdlet MyProject.Lib.dll-cmdlet使用的公共库代码 MyProject.EF.dll-仅实体框架内容 EF是独立的,因为我使用数据库优先的方法(我必须对现有系统进行反

是否可以构建包含实体框架(Core或EF6)的PowerShell cmdlet以访问SQL Server数据库

多年来,我一直在用C#编写cmdlet,但最近几天,由于程序集版本冲突,我在项目中尝试使用实体框架时经历了一场噩梦

该项目有三个库:

  • MyProject.Commands.dll
    -要加载的cmdlet
  • MyProject.Lib.dll
    -cmdlet使用的公共库代码
  • MyProject.EF.dll
    -仅实体框架内容
EF是独立的,因为我使用数据库优先的方法(我必须对现有系统进行反向工程),所以从数据库构建的各种
.cs
模型文件都在一个单独的单元中,以便保持它们的直线性

我正在Windows 10上构建所有这些,项目只需要在这台机器上运行。它正在与Azure云中的SQL数据库通信

第一次尝试:VS 2017/.Net Framework 4.7.1 在使用nuget添加所需的包之后,一切都很好,但是在
MyProject.Commands.dll上使用
Import Module
可以得到:

System.IO.FileNotFoundException: Could not load file or assembly \
   'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' \
   or one of its dependencies. The system cannot find the file specified.
在打开某种绑定调试日志记录之后

=== Pre-bind state information ===
LOG: DisplayName = System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 (Fully-specified)
LOG: Appbase = file:///C:/Windows/System32/WindowsPowerShell/v1.0/
LOG: Initial PrivatePath = NULL
Calling assembly : Microsoft.EntityFrameworkCore.Relational, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60.
我从来没有找到过确切版本的
System.ComponentModel.Annotation
,但互联网上充斥着关于同一问题的报道。我尝试了DLL中的AssemblyResolver的各种方法,各种框架的不同版本,最终一无所获

最终,我发现这个页面表明EF Core 3.x在任何.NET framework版本(在.NET Core上)上都不受支持,但几天前的这篇博文表明它现在终于得到了支持

以上是一个粗略的复述,因为它是在我去B计划之前的一段时间(昨晚晚些时候)的。这真是令人恼火

计划B:.NET Core 3.1上的EF Core 无论如何,我认为EF Core可能是未来更好的方向,于是我获得了VS2019,并将整个项目重新定位为.NET Core 3.1上的EF Core 3.1。这是我第一次涉足.NET核心

整理依赖关系花了一点时间(包括将
System.Management.Automation
替换为
Microsoft.PowerShell.SDK
),但最终都构建好了。安装Powershell 6后,我现在收到了以下信息:

VERBOSE: Loading module from path 'D:\Dev\MyProject\MyProject.Commands\bin\Debug\netcoreapp3.1\MyProject.Commands.dll'.
Import-Module : Could not load file or assembly 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f
7f11d50a3a'. The system cannot find the file specified.
太棒了

现在它找不到
System.Runtime
的4.2.2.0版,我真的不知所措

在每个项目的构建区域
bin\Debug\netcoreapp3.1\
目录中都有一个
*.deps.json
文件,其中列出了各种依赖项,但对
System.Runtime
的每一个引用都适用于4.3.0版

我试过Process Monitor,各种用于查看程序集的工具,以及在GAC中搜索。努芬

让它成为一个应用程序 在保持库不变的情况下,我将主逻辑封装到控制台应用程序中,并将其编译为
.EXE

它第一次奏效了

这可能吗? 构建控制台应用程序如此顺利的事实表明,试图在PowerShell中完成所有这些工作可能是无法解决的

一个独立的应用程序可以控制它自己的依赖项,但是构建必须在另一个程序(powershell)中托管的DLL意味着我们必须很好地处理它的依赖项

我突然想到,可以仔细分析现有的
pwsh.exe
(即Powershell 6)并找到其确切的依赖项集,然后查找恰好与该集匹配的EF Core版本。这似乎不太有希望,但可能很脆弱

作为数据点,此代码的早期版本在通过直接SQL调用与SQL server对话时工作正常,因此所有数据库访问负担都不足以破坏cmdlet compat。但添加EF核心似乎是可行的

我讨厌我的生活。我注定了吗

编辑说清楚一点,我不想在PowerShell脚本中使用实体框架,我甚至不确定我是否愿意。它在C#DLL中使用EF,以编程方式完成与数据库对话的所有繁重工作

我已经有了相当合理的直接SQL调用(同样,在C#中)可以很好地工作,但是我有几十个表要进行反向工程,让EF通过构建模型和所有易于访问的代码来为我完成这项工作非常有帮助

    foreach (var item in DbContext.Employee
             .Where(x => x.Salary > 1000.00)
             .OrderBy(x => x.EmployeeId))
    {
       do something
    }
实体框架包根据数据库中的定义构建了
Employee
类(尽管您也可以使用代码优先的方法),上面的代码是我必须编写的唯一代码

很长一段时间以来,我一直希望在PowerShell cmdlet中使用EF,但始终无法使其正常工作

一个不错的实体框架驱动读取:

编辑今天晚上,我发现我一直在为.NET核心而不是.NET标准构建代码(这又一次不同于原始的.NET框架),这在很大程度上解释了为什么没有正确加载东西

.NETCore似乎是一个可移植的子集,我只是迷失在杂草中,因为我不知道它们是不同的。此外,“核心”似乎过载(例如,“实体框架核心”可以在.Net标准上正常运行)。啊

我仍然无法让它像cmdlet一样工作和玩得很好,但从好的方面来说,我确实又浪费了几个小时

可能没有很好的解决办法

EDIT(6/2020)今天早上,我发现六个月前打开的程序集绑定日志正在用千兆字节的HTM文件填充我
C:\WINDOWS\SysWOW64\config\systemprofile\AppData\Local\Microsoft\WINDOWS\INetCache\IE
目录中的硬盘。哎呀


包括如何通过注册表启用/禁用此功能的说明。

不幸的是,这只是一个限制