ADO.NET Entity Connection String для нескольких проектов
Я использую проект с несколькими слоями, где DataModel размещает модель Entity ADo.NET и уровень DataAccess выполняет проверку.
Однако каждый раз я получаю ошибку, подобную этой
Указанное именованное соединение либо не находится в конфигурации, не предназначено для использования с поставщиком EntityClient, либо недействительно.
Я пробовал строки подключения
<add name="SalesEntities" connectionString="metadata=res://*/SalesEntities.csdl|res://*/SalesEntities.ssdl|res://*/SalesEntities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
и
<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
также попробовал другие комбинации для ссылки на корневую директорию каталога вызываемого проекта, но не повезло.
Любая помощь очень ценится. Большое спасибо, как всегда:).
Ответы
Ответ 1
Вы должны поместить эти строки подключения в каждый файл приложения app.config. Если у вас есть DAL, в котором вы сгенерировали модель, а затем попытайтесь использовать DAL в EXE, то произойдет то же самое. EXE не знает строку подключения.
Самое легкое, что я нашел, это поместить app.config в каждый проект и просто скопировать строку подключения из DAL I, сгенерировав модели в первоначально. Затем каждая из них будет иметь копию той же строки соединения.
Ответ 2
Если вы скопируете файл App.Config
в основной проект и замените все "
на обычный символ '
, он должен запустить
Ответ 3
Я предлагаю небольшое изменение в приведенных выше предложениях.
Это не огромное улучшение, но, по крайней мере, это дает вам некоторое разделение проблем.
Когда мастер EF создает файл .edmx и связанный с ним файл .Designer .cs
, код С# объявляет частичный класс. Таким образом, вы можете просто добавить еще один файл .cs
в проект, содержащий два файла EDM.
Этот новый файл определяет дополнительную статическую функцию для одного и того же пространства имен и класса.
Эта новая статическая функция вернет экземпляр требуемого типа (потомок объекта ObjectContext).
Новый файл представляет собой отдельный файл, поэтому он не будет перезаписан, если вы заново создаете .edmx и .Designer.cs.
Вы копируете и вставляете строку соединения из .config проекта EDM, который является своего рода хаком, но по крайней мере он удерживает строку соединения в проекте EDM.
Новый файл выглядит следующим образом:
namespace MyNamespace
{
public partial class MyEntities : ObjectContext
{
public static MyEntities New_MyEntities()
{
string connStr;
MyEntities theContext;
connStr = "metadata=res://*/MyClass.csdl|res://*/MyClass.ssdl|res://*/MyClass.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=localhost\\SQLSERVER;Initial Catalog=MyDb;Integrated Security=True;MultipleActiveResultSets=True\"";
// set the connection string
theContext = new MyEntities(connStr);
// allocate it
return theContext;
// return it
}
}
}
Чтобы получить объект новых объектов, вы просто вызываете статическую функцию New_MyEntities() из вашего вызывающего проекта.
Ответ 4
Я передал entityconnectionstring ко всем экземплярам классов objectContext и теперь его работу.
Но его слишком много накладных расходов, создавая свойство с помощью connectionstring и передавая его как параметр для каждого экземпляра
Ответ 5
Я добавляю ту же проблему, пытаясь выполнить unit-test мой DAL. Я обнаружил, что это работает:
<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
Ответ 6
У меня была аналогичная проблема с проектом WinForms, и, несмотря на то, что все, что я мог найти, связанное с ним в Интернете, не могло решить мою проблему..... пока я не удалю поле, которое я использовал для своего объекта ObjectContext (private CubEntities _oc = new CubEntities()) из моего BaseForm в фактическую форму, используя его.
Ответ 7
У меня такая же проблема, и я попробовал все упомянутый метод. наконец, я решил это, как уже упоминалось. В моем случае у меня есть отдельный слой данных и уровень представления. в моем app.config
(уровне данных) у меня есть соединение, подобное этому.
<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string="data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
в моем web.config
я вручную настроенном соединении следующим образом:
<add name="DefaultConnection" providerName="System.Data.SqlClient"
connectionString="Data Source=abc;
Initial Catalog=LibraryMgtSys;
Integrated Security=SSPI;
user id=sa;password=123;" />
он дает мне такое же исключение, как упоминалось выше. поэтому я решил это, добавив значение app.config в файл веб-конфигурации.
мой окончательный файл web.config
следующим образом:
<connectionStrings>
<clear />
<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string="data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
<add name="DefaultConnection" providerName="System.Data.SqlClient"
connectionString="Data Source=abc;
Initial Catalog=LibraryMgtSys;
Integrated Security=SSPI;
user id=sa;password=123;" />
</connectionStrings>
Ответ 8
У меня возникла проблема в одном из моих проектов, поскольку строкой соединения с сущностью требуется работа, веб-приложение и тестовый проект. Один из способов решения этой проблемы заключался в следующем:
1) Используйте шаблон UnitOfWork (или аналогичный). Это позволяет управлять созданием контекста данных и управлять строкой соединения
public partial class MyContext
{
#region Members
private static readonly object objSync = new object();
private static readonly string DATACONTEXT_KEY = "MyContext_UserInstance";
// TODO: read from a place accesible to all deployed projects
// remove hardcoded database
private static readonly string DefaultConnectionString = @"metadata=res://*/MyContext.csdl|res://*/MyContext.ssdl|res://*/MyContext.msl;provider=System.Data.SqlClient;provider connection string='data source=Server;initial catalog=MyDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework'";
private static string connectionString;
#endregion
public MyContext(String connectionString) : base(connectionString)
{
}
/// <summary>
/// Uses a UnitOfWorkStore to return the same instance of MyContext, that is unique
/// per user, per postback (or CallContext, if not in an HttpContext environment, such as unit tests or console apps)
/// </summary>
public static MyContext Instance
{
get
{
// Dirty (non thread-safe) check
if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null)
{
lock (objSync)
{
// Thread-safe check
if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null)
{
MyContext context = new MyContext(DefaultConnectionString);
connectionString = context.Database.Connection.ConnectionString;
UnitOfWorkStore.SetData(DATACONTEXT_KEY, context);
}
}
}
return (MyContext)UnitOfWorkStore.GetData(DATACONTEXT_KEY);
}
}
}
-
Контекст данных должен допускать ввод строки прямого подключения:
public MyContext (String connectionString): base (connectionString)
{
}