在 Powershell Cmdlet 中使用 Entity Framework Core?

2024-01-12

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

我多年来一直在用 C# 编写 cmdlet,但在过去的 coupla 日子里,由于似乎是程序集版本冲突,我在尝试在项目中使用实体框架时经历了一场噩梦。

项目有三个库:

  • 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 添加所需的包后,一切都构建得很好,但是使用Import-Module on MyProject.Commands.dll让我明白:

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尝试了各种方法,各种框架的不同版本,最终一无所获。

最终我找到了这个页面https://learn.microsoft.com/en-us/ef/core/platforms/ https://learn.microsoft.com/en-us/ef/core/platforms/这表明任何 .NET 框架版本(在 .NET Core 上)都不支持 EF Core 3.x,但是几天前的这篇博文https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-3-1-and-entity-framework-6-4/ https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-3-1-and-entity-framework-6-4/表明它现在已经得到支持了。

上面是一个粗略的重述,因为它是很久以前(昨晚深夜)在我执行 B 计划之前的事情。这太令人抓狂了。

B 计划:.NET Core 3.1 上的 EF Core

无论如何,我认为 EF Core 可能是未来更好的方向,因此我购买了 VS 2019,并将整个项目重新定位到 .NET Core 3.1 上的 EF Core 3.1。这是我第一次涉足 .NET Core。

花了一点时间才整理出依赖关系(包括交换System.Management.Automation for 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.

惊人的!!

现在找不到4.2.2.0版本System.Runtime,我真的很茫然。

在每个项目的构建区域内bin\Debug\netcoreapp3.1\目录是一个*.deps.json列出各种依赖关系的文件,但每个引用System.Runtime适用于 4.3.0 版。

我尝试过 Process Monitor,这是用于查看程序集、探索 GAC 的各种工具。纳芬。

使其成为一个应用程序

保持库不变,我将主要逻辑封装到控制台应用程序中,并将其编译为.EXE.

第一次就成功了。

这可能吗?

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

独立应用程序可以控制自己的依赖项,但是构建必须托管在另一个程序(powershell)内的 DLL 意味着我们必须与its依赖关系。

让我印象深刻的是might可以仔细分析现有的pwsh.exe(即 Powershell 6)并找到其确切的依赖项集,然后查找恰好与该集匹配的 EF Core 版本。这看起来前景并不乐观,但很可能很脆弱。

作为一个数据点,此代码的早期版本在通过直接 SQL 调用与 SQL 服务器通信时工作正常,因此所有数据库访问包袱不足以破坏 cmdlet 兼容性。但添加 EF core 似乎可以。

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

EDIT需要明确的是,我并没有尝试在 PowerShell 中使用实体框架script,我不确定我是否愿意。它在 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,但一直没能实现。

关于实体框架的一个很好的路过读物:https://learn.microsoft.com/en-us/ef/core/ https://learn.microsoft.com/en-us/ef/core/

EDIT今天晚上,我发现我一直在为 .NET Core 而不是 .NET Standard(这又与原始 .NET Framework 不同)构建代码,这在很大程度上解释了为什么无法正确加载。

.NET Core 似乎是一个可移植的子集,我只是因为我不知道的不同而迷失在杂草中。另外:“Core”似乎超载(例如“Entity Framework Core”可以在“.Net Standard”上运行良好)。啊。

我仍然无法让它作为 cmdlet 正常工作和运行,但从好的方面来说,我确实又多花了几个小时。

对此可能没有好的解决方案。

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

这个帖子 https://stackoverflow.com/questions/255669/how-to-enable-assembly-bind-failure-logging-fusion-in-net包括有关如何通过注册表启用/禁用此功能的说明。


我对此做了一些实验,实际上让它在 Powershell 7 中工作,但是我无法让它作为代码优先方法与 Powershell 类一起使用,因为 powershell 类的创建方式不与 dbset 结合。然而,数据库优先确实有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Powershell Cmdlet 中使用 Entity Framework Core? 的相关文章

随机推荐

  • 使用 Jeff Atwood 的示例清理 HTML

    我正在使用 Jeff Atwood 发现的代码清理我的 Htmlhere http refactormycode com codes 333 sanitize html 但我遇到的问题是当我将 Markdown 链接输入表单时 它们被删除
  • 使用java.util.logging登录控制台

    我只想使用 java util Logging 登录控制台 Logger log Logger getLogger my logger log setLevel Level ALL ConsoleHandler handler new Co
  • 从另一个 docker 容器连接到 Mongodb docker 容器

    我正在尝试从运行我的节点js代码的另一个docker容器连接在docker容器中运行的mongo DB 所以我使用以下命令运行 MongoDB docker docker run name my local mongo v mongo da
  • 从数据库下载exe文件

    我已经将一些 exe 文件上传到数据库中 因为我不希望它们可供公开访问 我尝试使用链接按钮和通用处理程序来使用以下代码提供文件 Context Response Clear Context Response ContentType appl
  • 请求 ruby​​-on-rails 应用程序会出现 Psych::BadAlias 错误

    我从应用程序目录运行 Rails 服务器 但是当我尝试从浏览器发出请求时 http localhost 3000 我收到以下错误 Psych BadAlias 无法加载Rails application database configura
  • WebRTC 连接在本地网络之外无法工作

    我们对 webrtc 双向视频和音频流进行了以下设置 Mobile Android应用程序使用谷歌网络RTC https webrtc org 实现java包装器 测试了这两个库 implementation org webrtc goog
  • Pandas 将字典列表分解为行

    拥有这个 items name 0 a 2 b 1 a 4 b 3 this 1 a 2 b 1 a 4 b 3 that 但希望将字典对象列表分解为 展平 为实际行 如下所示 a b name 0 2 1 this 1 4 3 this
  • Angular 2 Promise/Observable 链两个事件?

    我想知道是否可观察到的 or promise可用于 Angular 2 中的以下用例 有两个异步上传任务 我想知道如何检测这两项任务都已完成 我的上传任务 实现于promise但它很容易改变为可观察到的如果需要的话 是这样的 myServi
  • 在 macOS 中通过命令行与 Siri 交互

    我在手机和手表上使用 Siri 随时随地创建提醒 当我在办公室时 我不想使用 Siri 打扰安静 因此我通常使用与 提醒 应用程序集成的 Alfred 工作流程 或者直接使用 提醒 应用程序 然而 两者都有一个相当笨拙的界面 如果我可以在命
  • Zbar SDK - 缺少所需的架构 x86_64

    我在最近的 Xcode 5 1 中构建应用程序时遇到了一个问题 编译失败 并出现 架构 x86 64 的未定义符号 错误 我使用有效架构构建我的项目 armv7 armv7s 和 arm64 切换到最新的环境 Xcode 后 我在相同的架构
  • 随机化一个 BigInteger

    I m looking to randomize a BigInteger The intent is to pick a number from 1 to 8180385048 Though from what I noticed the
  • 运行 gulp 任务时如何解决“在 MakeCallback 中使用域属性已被弃用”警告?

    我正在使用带有 gulp 的节点来运行一些构建任务 直到几天前 这一切都还顺利 现在 我假设在升级 更新后 不确定是哪一个 我相信这是节点从 14 4 更新到 14 5 我不断收到此警告 DEP0097 DeprecationWarning
  • 使用 webpack、Threejs 示例和 TypeScript?

    我在将 Threejs 示例 如 EffectComposer 或 Detector 中的内容与 webpack 和 typescript 一起使用时遇到了很多麻烦 先把相关的 d ts文件全部存在并通过安装tsd 我的问题是让 webpa
  • Oracle:“= ANY()”与“IN ()”

    我刚刚在 ORACLE SQL 中偶然发现了一些我很好奇的东西 不确定其他中是否也有 我在这里作为维基询问 因为很难尝试在谷歌中搜索符号 我刚刚发现 当根据一组值检查一个值时 您可以执行以下操作 WHERE x ANY a b c 与通常的
  • 使用 OData 连接服务在 Blazor 客户端应用程序中使用 OData

    创建了 netstandard2 1 blazor Web 程序集项目 将 Odata Connected Service V 0 10 0 添加到同一项目 生成 OData 代理类 从 Razor 页面的 Task OnInitializ
  • 读取 Amazon Kinesis Firehose 流写入 s3 的数据

    我正在将记录写入 Kinesis Firehose 流 该流最终由 Amazon Kinesis Firehose 写入 S3 文件 我的记录对象看起来像 ItemPurchase String personId String itemId
  • document.execCommand 复制命令不起作用或其他解决方案?

    我正在做的是以编程方式从网页中选择所有文本 然后复制它 选择所有适用于execCommand但复制则不然 这是我的代码 ajax url url val type GET success function res result html r
  • Selenium Web 驱动程序等待很长时间

    我可以长时间等待 Selenium Web Driver 吗 尽管我可以像下面这样设置隐式等待命令 但它不会等待我给出的时间 driver manage timeouts implicitlyWait 5 TimeUnit MINUTES
  • C++/Win32:如何等待挂起的删除完成

    Solved 可行的解决方案 履行机构的答复 https stackoverflow com questions 3764072 c win32 how to wait for a pending delete to complete 37
  • 在 Powershell Cmdlet 中使用 Entity Framework Core?

    是否可以构建一个包含实体框架 Core 或 EF6 的 PowerShell cmdlet 以访问 SQL Server 数据库 我多年来一直在用 C 编写 cmdlet 但在过去的 coupla 日子里 由于似乎是程序集版本冲突 我在尝试