【问题标题】:Connection string for Entity Framework in an Azure FunctionAzure 函数中实体框架的连接字符串
【发布时间】:2019-04-18 12:04:51
【问题描述】:

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

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

我有这个例外:

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


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


我正在初始化我的数据库上下文如下:

using (XxxDB db = new XxxDB()) 
{ }

同时,我为委托人 XxxDB 创建了一个重载

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

并在创建XxxDB时传递SQL连接字符串得到这个错误:

不支持关键字:data source

【问题讨论】:

  • 如果项目首先使用代码,那么您不需要元数据,如果是,那么您确实需要元数据。问题是,你是如何实例化数据库上下文的?
  • @reckface:我首先使用数据库。我已经更新了我的问题
  • 你是如何实例化它的?这很重要,因为 EF 将在构造函数中使用命名连接字符串
  • @reckface:很抱歉误解了您的评论。我已经更新了我的问题。
  • 我更新了答案,表明您必须将 connectionString 分配为 ProviderConnectionString

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


【解决方案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;
}

【讨论】:

  • 遇到异常:Keyword not supported: 'metadata'.
  • 那是因为此时您不想包含元数据。你原来的问题有元数据错误。所以只需传递一个普通的 SQL 服务器连接字符串。
  • 找到了,我已将您的代码更新为:efConnection.Provider = "System.Data.SqlClient"; efConnection.Metadata = "res://*/Models.xxx.csdl|res://*/Models.xxx.ssdl|res://*/Models.xxx.msl"; 并从构造函数中删除了第二个参数。已接受并 +1,因为您让我走上了正确的道路。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多