Передача строки подключения к платформе Entity Framework 6
Я использую EF6 в библиотеке классов (сначала база данных)
Когда я последовал за мастером и добавил мои таблицы, я решил не хранить строку подключений в app.config и что я бы послал строку соединений.
Я этого раньше не делал. Обычно я выбираю строку подключения в файле app.config.
Теперь я полностью ошеломлен тем, как я на самом деле вызываю функцию и передаю ей строку подключения.
Ниже я надеюсь, что это соответствующие фрагменты кода из моего решения.
В app.config - EF автоматически добавлено следующее:
<connectionStrings>
<add name="cerviondemoEntities" connectionString="metadata=res://*/DatabaseModel.cervionEDM.csdl|res://*/DatabaseModel.cervionEDM.ssdl|res://*/DatabaseModel.cervionEDM.msl;provider=System.Data.SqlClient;provider connection string="data source=DEVBOX;initial catalog=cerviondemo;user id=sa;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
Мой автоматически созданный контекстный класс выглядит следующим образом:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CervionFunctions.DatabaseModel
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class cerviondemoEntities : DbContext
{
public cerviondemoEntities()
: base("name=cerviondemoEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Customer> Customers { get; set; }
public virtual DbSet<Ticket> Tickets { get; set; }
}
}
В конечном счете, я пытаюсь вызвать следующую тестовую функцию:
public static List<Customer> customersToUpdate()
{
cerviondemoEntities db;
using (db = new DatabaseModel.cerviondemoEntities())
{
var result = from customers in db.Customers
select customers;
return result.ToList();
}
}
Я не могу понять, как отправить строку подключения этой функции :(
Любая помощь будет принята с благодарностью!
Ответы
Ответ 1
По соглашению, Entity Framework принимает строку соединения, которая имеет то же имя, что и контекст. Например:
public cerviondemoEntities()
: base("name=cerviondemoEntities")
{
}
Класс DbContext имеет конструктор, который принимает строку соединения. Вы можете добавить еще один конструктор, который принимает параметр connectionstring в качестве параметра и передает его базовому конструктору.
public cerviondemoEntities(string connectionString) : base(connectionString)
{
}
Не забудьте создать частичный класс, чтобы ваш добавленный конструктор не был перезаписан.
Пример ConnectionString:
<connectionStrings>
<add name="cerviondemoEntities" connectionString="data source=server\database;initial catalog=catalog;persist security info=True;user id=user;password=password;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
Ответ 2
Вы должны ввести другой конструктор в вашем контексте, что ожидает string connectionString
аргумент и сделать его называют base(string nameOrConnectionString)
:
public cerviondemoEntities(string connectionString) : base(connectionString)
{
}
Ответ 3
У меня тоже была эта проблема, и я использовал метод Daniel в комментариях.
Кроме того, вы можете добавить его в файл.tt вместо создания другого файла и использовать "partial" - Daniel K Dec 9 '16 в 19:16
Обновить файл *.Context.tt
просто замените строки...
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
со следующим...
public <#=code.Escape(container)#>()
: this("name=<#=container.Name#>")
{
}
public <#=code.Escape(container)#>(String nameOrConnectionString)
: base(nameOrConnectionString)
{
Надеюсь, это поможет.
Ответ 4
Я использовал строку соединения как это, строку подключения сущности вместо обычной строки подключения
SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
{
DataSource = "SOURAV-PC", // Server name
InitialCatalog = "efDB", //Database
UserID = "sourav", //Username
Password = "mypassword", //Password
};
//Build an Entity Framework connection string
EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
{
Provider = "System.Data.SqlClient",
Metadata = "res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl",
ProviderConnectionString = sqlString.ToString()
};
return entityString.ConnectionString;
}