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