Azure函数中实体框架的连接字符串

时间:2019-04-18 12:04:51

标签: entity-framework azure-functions connection-string

我正在创建一个Azure函数,并且已经添加了对使用实体框架的项目的引用。我已经从该项目复制了连接字符串,并将其粘贴为local.settings.json对象内的ConnectionStrings文件中作为有效的EF连接字符串。

metadata=res://*/xxx.csdl|res://*/xxx.ssdl|res://*/xxx.msl;
provider=System.Data.SqlClient;
provider connection string=&quote;
    data source=xxx;
    initial catalog=xxx;
    user id=xxx;
    password=xxx;
    MultipleActiveResultSets=True;
    App=EntityFramework
&quote;

但是给了我这个例外:

  

不支持关键字:metadata


如果我使用有效的SQL连接字符串(如下所示)

data source=xxx;
initial catalog=xxx;
user id=xxx;
password=xxx;
MultipleActiveResultSets=True;
App=EntityFramework

我有这个例外:

  

在代码优先模式下,将上下文与从EDMX文件生成的代码一起用于数据库优先或模型优先开发。这将无法正常工作。若要解决此问题,请不要删除引发此异常的代码行。如果要使用数据库优先或模型优先,请确保在启动项目的app.configweb.config中包含Entity Framework连接字符串。如果要创建自己的DbConnection,请确保它是EntityConnection而不是其他类型的DbConnection,并将其传递给基本{{1} }使用DbContext的构造函数。要了解有关代码优先,数据库优先和模型优先的更多信息,请参见Entity Framework文档:http://go.microsoft.com/fwlink/?LinkId=394715


如何使用Entity Framework在Azure函数中创建到数据库的连接?我正在使用.NET Framework,对于EF,我首先使用数据库。


我按如下所示初始化数据库上下文:

DbConnection

与此同时,我为委托人using (XxxDB db = new XxxDB()) { }

创建了一个重载。
XxxDB

并在创建public XxxDB(string connectionString): base(new EntityConnection(connectionString), true) { } 时传递SQL连接字符串,并得到此错误:

  

不支持关键字:XxxDB

1 个答案:

答案 0 :(得分:1)

好的,这是由EF模型第一个连接字符串的生成引起的。 EF连接字符串构建器在构造函数中需要纯连接字符串。然后,您首先添加模型的元数据部分。

创建新的连接字符串以传递给数据库上下文字符串构建器时,请更改以下内容:

public XxxDB(string connectionString): base(new EntityConnection(connectionString), true)
{ }

public XxxDB(string connectionString): base(GetEntityConnection(connectionString), true)
{ }

private static string GetEntityConnection(string connectionString)
{
    var efConnection = new EntityConnectionStringBuilder();
    efConnection.ProviderConnectionString = connectionString;
    // res://*/xxx.csdl|res://*/xxx.ssdl|res://*/xxx.msl
    var model = "xxx";
    // this is what's missing in your question
    efConnection.Metadata = string.Format("res://*/Model.{0}.csdl|res://*/Model.{0}.ssdl|res://*/Model.{0}.msl", model);
    return efConnection.ConnectionString;
}