【问题标题】:Database first - EF6 On Mono数据库优先 - Mono 上的 EF6
【发布时间】:2019-08-27 04:40:51
【问题描述】:

上下文:

我需要在我的本地机器上运行一个“旧版”.Net 应用程序,它是一台 Macbook...(我们的大部分堆栈都是 dotnetcore),但这个特定的应用程序有点旧。

虽然我确实意识到启动 Windows VM 并在其中构建它会容易得多,但我正在努力构建项目(并使用 MONO 运行)

到目前为止,我已经通过在.csproj 中添加一些条件检查解决了一些问题,这使得应用程序构建和运行......几乎没有,因为当我点击第一个检查数据库连接的 API 时它就死了.

当前设置:

  • Mono JIT 编译器版本 5.18.1.3
  • .Net 目标 4.6.1
  • Rider IDE(我也安装了 VS for OSX)
  • EF6.1.3

项目的结构如下:

Project.Data
  - App.Config
  - DataModel.edmx
Project.Api (which references the Project.Data) 
  - Web.Config

两者都包含以下连接字符串(为简洁起见,缩进):

<add name="SomeEntities" 

connectionString="
metadata=
  res://*/DataModel.csdl|
  res://*/DataModel.ssdl|
  res://*/DataModel.msl;

provider=System.Data.SqlClient;

provider connection string=
  &quot;
    data source=somedb;
    initial catalog=some_catalog;
    user id=some_id;
    password=some_password;
    App=EntityFramework;
  &quot;
" 

providerName="System.Data.EntityClient" />

问题:

我认为发生的事情是常规构建任务不会从 .edmx 生成正确的文件,但至于如何在我当前的环境中执行此操作......我开始认为这是不可能的。

错误:

Unable to load the specified metadata resource.
  at System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources

我看过各种关于修改连接字符串的帖子,结果各不相同,但从未导致应用程序正常运行。

更改为 metadata=res://*/; 会导致:

Argument 'xmlReader' is not valid. A minimum of one .ssdl artifact must be supplied. 
  at System.Data.Entity.Core.EntityUtil.CheckArgumentEmpty[T]

更改为标准的 SqlConnection 字符串:

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 
The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development.  This will not work correctly. To fix this problem do not remove the line of code that throws this exception. If you wish to use Database First or Model First, then make sure that the Entity Framework connection string is included in the app.config or web.config of the start-up project. If you are creating your own DbConnection, then make sure that it is an EntityConnection and not some other type of DbConnection, and that you pass it to one of the base DbContext constructors that take a DbConnection. To learn more about Code First, Database First, and Model First see the Entity Framework documentation here: http://go.microsoft.com/fwlink/?LinkId=394715

问题:

这完全有可能吗,还是我应该恢复获得一台 Windows 机器?

【问题讨论】:

    标签: .net entity-framework msbuild mono


    【解决方案1】:

    随着现在有更好的跨平台支持的新版本 EF 可用,升级 EF 解决了这个问题。 (从 6.2.0 升级到 6.4.4)

    【讨论】:

    • 我试过了,但是在 ubuntu 上运行 msbuild 和 6.4 Entity Framework 并没有解决任何问题,文件仍然没有生成。
    • 奇怪,在 OSX 上,我从 6.2.0 升级到 6.4.4 并将其添加到项目设置中 解决了这个问题
    • 嗯,好的,我会试试的。这是你添加的哪个文件?
    • 我将它添加到 csproj,但在 msbuild 编译后运行项目,仍然给我unable to load the specified metadata resource 错误。 (Ubuntu)
    • 我开始了一个新项目,只导入了源文件并让它工作了!因此,使用较新的 6.4 实体框架实际上可以在 Linux 上构建项目并使用 mono 部署它。非常好,感谢您的帮助!
    【解决方案2】:

    因此,在浏览了一段时间的网络,并在一些论坛和群组中询问后,我得出的结论是,这可能是徒劳的,尤其是考虑到像 dotnetcore 这样的东西如今已经司空见惯。

    VS Code for Mac 团队的一位开发人员回答了 issue 的更多上下文...

    在 Windows 上,有一些 Microsoft.Data.Entity MSBuild 任务。这些 用于在构建时生成各种 .csdl、.ssdl 和 .msl 文件 .edmx 文件中的时间。如果您查看 Visual 中的构建输出 Windows 上的 Studio,您应该会看到类似于以下内容的内容:

    完全构建目标“EntityDeployEmbeddedResources”。输出 文件“obj\Debug\edmsREsourcesToEmbed\Model.ssdl”不存在。使用 来自程序集的“EntityDeploy”任务 “C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Data.Entity.Build.Tasks.dll”。 Microsoft.Data.Entity.Build.Tasks.dll 和相关的 Mac 不存在 Microsoft.Data.Entity.targets 文件。

    在 Mac 上,唯一的解决方法是使用 Entity Framework Core,它 是跨平台的,不使用 edmx 文件,因为这些不是 支持。

    因此选项是:

    • 端口到 dotnetcore,或
    • 获取一台windows机器

    ...对于这个旧版应用程序。而且由于我们正在迁移到 dotnetcore... 我相信现实的解决方案是优先将此特定项目移植到 dotnetcore。

    【讨论】:

    • 放弃不是答案。
    • 但是改变你的方法是:) 如果你读了我的回答......你会看到我已经列出了它们。你可能不喜欢它......但这是一个有效的答案。我也很想永远坐下来处理事情,但有时业务需要继续;)
    • 好的,你是对的。已经有几天了,它只是不工作。我什至尝试在 Windows 中构建与数据库的实际连接,然后部署到 xsp,然后部署到 apache2/mod_mono。没有骰子。同样的错误仍然存​​在。你可以拿回你的updoot。
    • 作为记录,迁移到 .net 核心并不是特别痛苦,虽然没有像我希望的那样在较暗的角落有详细的记录。
    • 希望我能对我们的项目说同样的话,这个项目有点呃......老......我们在这个阶段不得不零碎地完成它。但很高兴知道隧道尽头有光。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多