将连接字符串传递给实体框架6

Tre*_*iel 21 c# entity-framework

我在类库中使用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>
Run Code Online (Sandbox Code Playgroud)

我自动生成的上下文类如下所示:

//------------------------------------------------------------------------------
// <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; }
}
}
Run Code Online (Sandbox Code Playgroud)

最后,我试着调用以下测试函数:

public static List<Customer> customersToUpdate()
    {
        cerviondemoEntities db;

        using (db = new DatabaseModel.cerviondemoEntities())
        {
            var result = from customers in db.Customers
                         select customers;

            return result.ToList();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何将连接字符串发送到该函数:(

任何帮助将不胜感激!

And*_*mos 40

按照惯例,Entity Framework采用与上下文同名的连接字符串.例如:

public cerviondemoEntities()
    : base("name=cerviondemoEntities")
{
}
Run Code Online (Sandbox Code Playgroud)

DbContext类有一个构造函数,它接受一个连接字符串.您可以添加另一个构造函数,该构造函数将connectionstring作为参数并将其传递给基础构造函数.

public cerviondemoEntities(string connectionString) : base(connectionString)
{
}
Run Code Online (Sandbox Code Playgroud)

请务必创建一个分部类,以便不会覆盖添加的构造函数.

示例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>
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以将其添加到.tt文件中,而不是创建另一个文件并使用"部分" (4认同)

Ski*_*ner 6

我也遇到了这个问题,并在评论中使用了Daniel的方法。

另外,您也可以将其添加到.tt文件中,而不是创建另一个文件并使用“部分”文件-Daniel K 16年9月9日,19:16

更新* .Context.tt文件

只需更换线...

    public <#=code.Escape(container)#>()
    : base("name=<#=container.Name#>")
{
Run Code Online (Sandbox Code Playgroud)

与以下...

public <#=code.Escape(container)#>()
    : this("name=<#=container.Name#>")
{
}

public <#=code.Escape(container)#>(String nameOrConnectionString)
    : base(nameOrConnectionString)
{
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。


hai*_*770 5

您需要在您的上下文中引入另一个需要string connectionString参数的构造函数并使其调用base(string nameOrConnectionString)

public cerviondemoEntities(string connectionString) : base(connectionString)
{
}
Run Code Online (Sandbox Code Playgroud)