База данных первая - EF6 On Mono - PullRequest
0 голосов
/ 05 апреля 2019

Контекст:

Мне нужно получить «устаревшее» .Net-приложение, работающее на моей локальной машине, которая является Macbook ... (большая часть нашего стека - dotnetcore), но это конкретное приложение немного старше.

Хотя я и понимаю, что гораздо проще, наверное, просто раскрутить виртуальную машину с Windows и встроить ее в нее, но я пытаюсь получить сборку проекта (и запустить с использованием MONO)

Пока что я решил несколько проблем, добавив несколько условных проверок в .csproj, который заставлял сборку и запуск приложения ... едва ли он умирает, когда я нажимаю на первый API, который проверяет БД на связность .

Текущая настройка:

  • Mono JIT-компилятор версии 5.18.1.3
  • .Net Target 4.6.1
  • Rider IDE (у меня также установлен VS для 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-машину?

1 Ответ

1 голос
/ 08 апреля 2019

Итак, пройдя некоторое время в Интернете и спросив на нескольких форумах и в группах, я пришел к выводу, что это может быть бесполезным усилием, особенно если учесть, что такие вещи, как dotnetcore, сегодня являются обычным явлением.

Еще немного контекста по проблеме , на которую ответил один из разработчиков команды VS Code для Mac ...

В Windows есть некоторые Microsoft.Data.Entity MSBuild задач.Они используются для генерации различных файлов .csdl, .ssdl и .msl во время сборки из файла .edmx.Если вы посмотрите на выходные данные сборки в Visual Studio в Windows, вы должны увидеть что-то похожее на:

Полное построение цели "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 и связанный с ним файл Microsoft.Data.Entity.targets не существуют для Mac.

На Mac единственным выходом является использование Entity Framework Core, которое являетсякросс-платформенный и не использовать EDMX-файлы, так как они не поддерживаются.

Таким образом, параметры:

  • Порт для dotnetcore или
  • ПолучитьWindows Machine

... для этого старого приложения.И поскольку мы в любом случае переходим на dotnetcore ... Я считаю, что реалистичным решением является установление приоритетов при переносе этого конкретного элемента в dotnetcore.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...