У меня есть автоматизированное тестовое решение, которое (допустим) содержит 3 проекта:
Я борюсь с: Сначала я получал эту ошибку:
No connection string named 'MyEntities' could be found in the application config file
Я прочитал некоторую статью о стеке и добавил узел строки подключения (я бы хотел избежать этого), и теперь я получаю эту ошибку:
Errors: TestModel.ssdl(2,2) : error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file.
Итак, мой вопрос: что я делаю не так? Как я могу установить EF, не добавляя ссылки на EF в каждом проекте (я считаю, что EF этого хочет от меня сейчас).
Связанные узлы .config:
<entityFramework>
<defaultConnectionFactory type = "System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value = "mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName = "System.Data.SqlClient" type = "System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<connectionStrings>
<add name = "test1Entities" connectionString = "metadata=res://*/TestModel.csdl|res://*/TestModel.ssdl|res://*/TestModel.msl;provider=System.Data.SqlClient;provider connection string="data source=MSSQL-TEST;initial catalog=testCATALOG;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" <providerName = "System.Data.EntityClient" />
</connectionStrings>
А пока я вызываю этот метод из трех своих проектов.
public static void TestMyEF()
{
using (var ctx = new test1Entities())
{
var abc = ctx.someTable.FirstOrDefault();
}
}
Контекстный ctor:
public test1Entities()
: base("name=test1Entities")
{
}
P.s. Я использовал первый подход к базе данных (создать .edxm из существующей базы данных), и я немного обеспокоен, потому что мой узел .config содержит <parameter value = "mssqllocaldb" />
, БД не является локальной.
Вы можете использовать предикаты (универсальных типов), чтобы выполнять свою работу по вызову функций, которые вы хотите выполнять в своей структуре сущностей, вместе с тем, что вам необходимо предоставить модели (структуру сущностей) вызывающему приложению.
@vikscool В том-то и дело, решение уже довольно большое и беспорядочное, поэтому я не хочу, чтобы какой-либо другой проект взаимодействовал с контекстом или объектами, я хочу, чтобы мой проект DA был максимально закрыт для другого проекта. Таким образом, представление модели другому проекту (обратите внимание, что они будут запрашивать возврат в собственных типах или пользовательских классах, а не в сущностях) кажется бессмысленным (я имею в виду, что EF будет бессмысленным, потому что это только создаст еще больше беспорядка в решении).
@VidmantasBlazevicius Что делать, если я не собираюсь использовать контекст напрямую, например project1 хочет, чтобы project2 сканировал контекст и возвращал некоторые строки, должен ли porject1 иметь ссылку на EF?
@ Vadim.K в этом случае можете ли вы использовать common library project
для использования между двумя проектами, давайте просто предположим, что resultClass
с объектом для результата и любым ответом, который вы хотите назначить этому объекту результата, а затем позволить другому проекту получить доступ только к общему классу результатов, а затем получить доступ к его значению.
Если вы создаете свой собственный уровень абстракции с помощью таких методов, как GetSomething()
, вам не нужно будет ссылаться на библиотеки EF, но тогда вам нужно будет ссылаться на проект, в котором находятся эти уровни абстракции.
@vikscool, привет, я пытался передать строку подключения metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=MSSQL-TEST-QA;initial catalog=test1_ei_ei0;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
и получаю ошибку Keyword not supported: 'data source'.
.
@ Vadim.K, пожалуйста, обратитесь к этому ссылка на сайт
@vikscool yeap, я уже исправил эту проблему (просто совет из другого сообщения о замене и цитате кавычками вводил в заблуждение, пришлось заменить на \"
), и мне даже удалось заставить это работать, к сожалению, для этого мне пришлось установить EF для вызова проектов, других недостатков я получаю ошибку - No Entity Framework provider found for the ADO.NET provider with invariant name
@vikscool невероятно тупой, но работает stackoverflow.com/a/19130718/6634405
@vikscool, можете ли вы опубликовать свой ответ как сообщение, чтобы я мог отметить вопрос как ответ?
Создайте общую библиотеку классов для результата, например, как:
public class MyResultClass
{
public readonly object Value;
public readonly Exception ResultException;
//add more properties if needed
public MyResultClass(object value)
{
this.ResultException = null;
this.Value = value;
}
public MyResultClass(Exception ex)
{
this.ResultException = ex;
}
}
затем используйте ссылку на этот класс в своих проектах, чтобы у вас не было зависимости от entity-framework
, а затем вы можете использовать json (сериализация и десериализация) для преобразования данных из вашего DAP(DataAccessProject)
в клиент (вызывающий проект).
Передайте строку подключения непосредственно в конструктор, а не имя записи конфигурации. Это избавит вас от вашей первой ошибки. В любых проектах, где вы действительно используете контекст, вам нужно будет добавить ссылки на библиотеки EF.