Entity Framework 6 задает строку подключения в коде

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

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

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

не удается найти строку подключения для MyDatabaseEntity

автоматически сгенерированная connectionstring, как я уже сказал, находится в конфигурационном файле dll. Я не могу изменить приложение.config приложения. Но приложение передает объект, который имеет всю информацию, необходимую мне для создания строки подключения самостоятельно. Поэтому я ищу способ установить строку соединения в коде не полагаясь на файл 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; }
}

3 ответов


Как насчет:

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

Я получил это решение, используя ниже код, я могу hardcode строку подключения с помощью кода 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 = "Sa123!@#",  //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;password=Sa123!@#;"// sqlString.ToString()
            };
            return entityString.ConnectionString;
        }

и используя DbContext, используя следующее:

Join8ShopDBEntities dbContext = new Join8ShopDBEntities(SingleConnection.ConString);

у меня была аналогичная проблема. Мой Edmx и приложение.Config был в другом проекте. Мой проект запуска был другим, имел 3 разные строки подключения, нам нужно выбрать один на лету в зависимости от среды. Поэтому нельзя использовать фиксированную строку подключения. Я создал частичную перегрузку класса контекста.cs, использующий то же пространство имен. Ниже был мой контекст по умолчанию.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));