Передача строки подключения к платформе 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=&quot;data source=DEVBOX;initial catalog=cerviondemo;user id=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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;
    }