Строка подключения объекта ADO.NET для нескольких проектов

Я использую многослойный проект, в котором DataModel размещает модель сущности 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=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

а также

<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

также пробовали другие комбинации для ссылки на корневой каталог вызываемого каталога проекта, но безуспешно.

Любая помощь высоко ценится. Большое спасибо, как всегда :).


person Sumanta    schedule 11.07.2009    source источник


Ответы (8)


Вы должны поместить эти строки подключения в каждый файл приложения app.config. Если у вас есть DAL, в котором вы сгенерировали модель, а затем попытаетесь использовать DAL в EXE, произойдет то же самое. EXE не знает строку подключения.

Самое простое, что я нашел, - это поместить app.config в каждый проект и просто скопировать строку подключения из DAL, в котором я сгенерировал модели изначально. Тогда у каждого будет копия той же строки подключения.

person Jason Short    schedule 11.07.2009
comment
хм, возможно ли каким-то образом хранить все строки подключения в одном месте, а затем «сообщать» всем файлам web.config, где найти эти строки подключения? - person Tony; 21.10.2010
comment
Вы можете поместить их в MACHINE.CONFIG (глобальный на машине), но для этого требуются дополнительные привилегии, и развертывание в этом сценарии не является хорошей идеей. - person Jason Short; 28.10.2010
comment
Используя частичный класс, вы можете создать свой собственный конструктор для контекста данных, сгенерированного для ваших сущностей, и задать им строку подключения, как вы хотите. Вам также придется вызывать этот конкретный конструктор при создании экземпляра контекста данных. - person Joel McBeth; 12.05.2011

Если вы скопируете свой App.Config файл в основной проект и замените все &quot; обычным символом ', он должен запуститься

person keith    schedule 16.07.2010

Я предлагаю немного изменить предложения, данные выше.

Это небольшое улучшение, но, по крайней мере, дает вам некоторое разделение проблем.

Когда мастер EF создает файл .edmx и связанный с ним файл .Designer.cs, код C # объявляет частичный класс. Таким образом, вы можете просто добавить в проект еще.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 () из вызывающего проекта.

person MindModel    schedule 28.12.2010

Я передал entityconnectionstring всем экземплярам классов objectContext, и теперь он работает.

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

person Balaji B    schedule 16.11.2010

Я добавляю ту же проблему, пытаясь протестировать свой DAL. Я обнаружил, что это работает:

<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
person D.Thouvenin    schedule 27.01.2010

У меня была аналогичная проблема с проектом WinForms, и, несмотря на то, что я пытался все, что я мог найти связанного с ним в Интернете, не смог решить мою проблему ... пока я не удалил поле, которое я использовал для своего ObjectContext (private CubEntities _oc = new CubEntities ()) из моей BaseForm в фактическую форму, использующую его.

person daveywc    schedule 06.07.2010

У меня такая же проблема, и я попробовал все упомянутые методы. наконец, я решил это, как уже упоминалось. В моем случае у меня есть отдельный уровень данных и уровень представления. в моем app.config (уровне данных) у меня такое соединение.

 <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True&quot;" 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=&quot;data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True&quot;" 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>
person DevT    schedule 13.11.2013

У меня была проблема в одном из моих проектов, поскольку строка подключения структуры сущности требовалась для задания, веб-приложения и тестового проекта. Один из способов справиться с этим заключался в следующем:

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);
        }
    }

}
  1. Контекст данных должен позволять прямой ввод строки подключения:

    общедоступный MyContext (String connectionString): base (connectionString) {}

person Alexei - check Codidact    schedule 29.09.2015