2014-06-16 121 views
11

我使用EF6在类库(数据库第一)传递连接字符串到实体框架6

当我跟着该向导,并加入我的表我选择为不连接的字符串存储在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(); 
     } 
    } 

我不知道如何发送连接字符串到该函数:(

任何帮助将不胜感激!

回答

28

按照惯例,实体框架采用的是具有相同的名称作为上下文的连接字符串。 例如:

public cerviondemoEntities() 
    : base("name=cerviondemoEntities") 
{ 
} 

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

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> 
+3

或者,你可以将它添加到.TT文件,而不是创建另一个文件,并使用“部分” – Daniel

+0

谢谢不适用于v 6.1.3您可以在app.config文件中提供需要的功能吗?还提供了一个连接字符串的例子,使您的答案工作 –

+0

我已经添加了一个示例连接字符串。 –

3

您需要引入你的背景中另一个构造函数期待一个string connectionString参数,并使其拨打base(string nameOrConnectionString)

public cerviondemoEntities(string connectionString) : base(connectionString) 
{ 
} 
2

我有这个问题,也是和在注释中使用从丹尼尔的方法。在19:16

更新* .Context丹尼尔ķ年12月09 '16 -

或者,你可以将它添加到.TT文件,而不是创建另一个文件,并使用“部分”。 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) 
{ 

我希望这会有所帮助。

1

我已经使用的连接字符串这样的,实体的连接字符串,而不是正常的连接字符串

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; 
    } 
相关问题