2015-12-18 8 views
6

У меня есть dll, которая использует Entity Framework 6 для выполнения некоторых операций с базой данных. Я использую первый подход к базе данных. Модель и все, что связано с платформой Entity Framework, как и строка подключения в App.config, были созданы с помощью wizzard в Visual Studio.Entity Framework 6 установил строку подключения в коде

Поэтому я скомпилировал dll и поместил его вместе с соответствующим .config в папку, в которой ожидает приложение, использующее dll.

Все работает нормально, пока не дойду до того момента, когда будет выполнен фактический вызов базы данных. Там я получаю ошибку:

Cannot find connection string for MyDatabaseEntity

Автоматически сгенерированная строка соединения, как я уже сказал, в файле конфигурации DLL. Я не могу изменить App.config приложения. Но приложение передает объект, у которого есть вся информация, необходимая мне для сборки строки подключения. Итак, я ищу способ установить строку соединения в коде, не полагаясь на файл конфигурации. Все эти учебники, которые я нахожу для первого подхода к базе данных, используют этот метод. Я нашел пост здесь, который говорит, чтобы просто дать строку соединения в качестве параметра при создании объекта, как

MyDatabaseEntities = new MyDatabaseEntities(dbConnect); 

но'MyDatabaseEntities' не имеет конструктор, который принимает любые параметры

public partial class MyDatabaseEntities : DbContext 
{ 
    public MyDatabaseEntities() 
     : base("name=MyDatabaseEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<MyTable> MyTable { get; set; } 
} 

ответ

7

Как насчет:

public partial class MyDatabaseEntities : DbContext 
{ 
public MyDatabaseEntities(string connectionString) 
    : base(connectionString) 
{ 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new UnintentionalCodeFirstException(); 
} 

public virtual DbSet<MyTable> MyTable { get; set; } 

}

Затем инициализировать базу данных, как вы делали раньше:

string myConnectionString = "..."; 
MyDatabaseEntities = new MyDatabaseEntities(myConnectionString); 
+1

Я не знал, что строка в базе() была строка соединения. Спасибо, что сделал. – FNR

+0

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

+0

Я установил соединение, как это: string connection = @ "metadata = res: //*/ShopModel.csdl | res: //*/ShopModel.ssdl | res: //*/ShopModel.msl; поставщик = System.Data.SqlClient; строка подключения поставщика = " источник данных = SIPL35 \ SQL2016; начальный каталог = Join8ShopDB2; user id = Sa; password = Sa123! @ #; MultipleActiveResultSets = True; App = EntityFramework " "; Join8ShopDBEntities dbContext = new Join8ShopDBEntities (соединение); но он дает мне исходное ключевое слово источника данных, не идентифицированное исключение –

2

Я получил это решение, используя ниже код, я могу жёстко строку подключения с помощью C# код без использования конфигурационного файла.

public class SingleConnection 
    { 
     private SingleConnection() { } 
     private static SingleConnection _ConsString = null; 
     private String _String = null; 

     public static string ConString 
     { 
      get 
      { 
       if (_ConsString == null) 
       { 
        _ConsString = new SingleConnection { _String = SingleConnection.Connect() }; 
        return _ConsString._String; 
       } 
       else 
        return _ConsString._String; 
      } 
     } 

     public static string Connect() 
     { 
      //Build an SQL connection string 
      SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() 
      { 
       DataSource = "SIPL35\\SQL2016".ToString(), // Server name 
       InitialCatalog = "Join8ShopDB", //Database 
       UserID = "Sa",   //Username 
       Password = "[email protected]#", //Password 
      }; 
      //Build an Entity Framework connection string 
      EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() 
      { 
       Provider = "System.Data.SqlClient", 
       Metadata = "res://*/ShopModel.csdl|res://*/ShopModel.ssdl|res://*/ShopModel.msl", 
       ProviderConnectionString = @"data source=SIPL35\SQL2016;initial catalog=Join8ShopDB2;user id=Sa;[email protected]#;"// sqlString.ToString() 
      }; 
      return entityString.ConnectionString; 
     } 

и используя DbContext используя так:

Join8ShopDBEntities dbContext = new Join8ShopDBEntities(SingleConnection.ConString); 
0

Я имел подобный вопрос. Мой Edmx и App.Config были в другом проекте. Мой проект запуска был другим, имел 3 разных строки подключения, нам нужно выбрать один на лету в зависимости от среды. Поэтому не удалось использовать фиксированную строку соединения. Я создал частичную перегрузку класса Context.cs, используя одно и то же пространство имен. Следующим был мой default Context.cs;

namespace CW.Repository.DBModel 
{ 

    public partial class CWEntities : DbContext 
    { 
     public CWEntities() 
     : base("name=CWEntities") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
     throw new UnintentionalCodeFirstException(); 
     } 
    ... 
    ... 
    } 
} 

Мой неполный класс перегрузки;

namespace CW.Repository.DBModel 
{ 
    public partial class CWEntities : DbContext 
    { 
     public CWEntities(string ConnectionString) 
      : base(ConnectionString) 
     { 
     }   
    } 
} 

Наконец, поскольку мои строки подключения не были для EF, я преобразовал их в строку соединения EF.

public static string GetEntityConnectionString(string connectionString) 
    { 
     var entityBuilder = new EntityConnectionStringBuilder(); 

     // WARNING 
     // Check app config and set the appropriate DBModel 
     entityBuilder.Provider = "System.Data.SqlClient"; 
     entityBuilder.ProviderConnectionString = connectionString + ";MultipleActiveResultSets=True;App=EntityFramework;"; 
     entityBuilder.Metadata = @"res://*/DBModel.CWDB.csdl|res://*/DBModel.CWDB.ssdl|res://*/DBModel.CWDB.msl"; 

     return entityBuilder.ToString(); 
    } 

Наконец, вызывающий

var Entity = new CWEntities(CWUtilities.GetEntityConnectionString(ConnectionString)); 
Смежные вопросы