【问题标题】:Entity Framework in Azure Function in Visual StudioVisual Studio 中 Azure 函数中的实体框架
【发布时间】:2017-11-21 05:53:09
【问题描述】:

在 Visual Studio 中,我有一个用 C# 编写的 Azure 函数,它应该使用实体框架 (EF6) 从 Azure SQL 数据库中读取。

我无法让实体框架工作。当我发布 Azure 函数时出现错误:

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

这些都不起作用。

我还尝试按照许多网站的建议在 Azure 中添加一个 project.json 文件,但这并没有改变任何东西。

这里是 C#。

public static class Function1
{
    [FunctionName("Function1")]
    public static void Run([TimerTrigger("*/100 * * * * *")]TimerInfo myTimer, TraceWriter log)
    {
        try {
            using (var qc = new quotecandyEntities()) {

                if (qc.Users.Any()) {
                    log.Info($"The last user is {qc.Users.Last().Email}.");

                } else {
                    log.Info("No users found in database.");
                }
            }
        } catch (Exception ex) {
            log.Error($"Error: {ex.Message}");
        }
    }
}

【问题讨论】:

  • edml dll 是否与 Visual Studio 中的包一起部署。可能是quotecandyEntities()相关的类没有被复制。
  • 我对 Azure 比较陌生。我在哪里可以看到部署了哪些文件?
  • 您可以使用 kudu 浏览器查看部署了哪些文件。 Kudu可以通过functionappname.scm.azurewebsites.net访问
  • 您可以使用 kudu 浏览器查看部署了哪些文件。 Kudu 可以通过functionappname.scm.azurewebsites.net 访问 进入 Kudu 后,您可以转到调试控制台 - 选择 cmd。这将打开一个 bash 窗口。 blogs.msdn.microsoft.com/uk_faculty_connection/2017/05/15/…这里给出了kudu的概述
  • 在 D:\home\site\wwwroot\bin\ 下我看到这些文件:Dolaris.QuoteCandy.EDM.dll、Dolaris.QuoteCandy.EDM.dll.config EntityFramework.dll、EntityFramework.SqlServer。 dll、EntityFramework.xml、Microsoft.Data.Edm.dll、Microsoft.Data.OData.dll

标签: c# entity-framework azure


【解决方案1】:

根据您的描述,我假设您使用的是数据库优先或模型优先,并且您为实体数据模型配置了错误的实体框架连接字符串。我测试发现,如果我在使用 Database First 时直接从 Azure Portal 复制连接字符串,我会遇到您提供的类似问题,如下所示:

对于 Database First,我建议您修改生成的 Model.Content.cs 并配置您的 DbContext,如下所示:

public partial class Entities : DbContext
{
    public Entities():base(ConfigurationManager.ConnectionStrings["Entities"].ConnectionString)
    {

    }
}

注意:您可以修改 t4 模板,并确保在从数据库更新模型后,您对 DbContext 的修改不会被覆盖。

对于开发者,您可以在local.settings.json 文件下设置连接字符串,如下所示:

"ConnectionStrings": {
  "Entities": "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='data source={server-name}.database.windows.net;initial catalog={db-name};persist security info=True;user id={username};password={password};MultipleActiveResultSets=True;App=EntityFramework'"
}

在发布到 azure 之前,您可以创建一个与您在local.settings.json 文件下配置的相同的连接字符串,并将连接字符串设置如下:

此外,关于在 Azure Function 中使用 EF Database First 的方法,您可以遵循类似的 issue

【讨论】:

  • 在代码本身中添加连接字符串,而不是设置,有效!谢谢!
  • 这对我有用。只是一个小补充,我不得不在我的 tt/cs 文件中添加一个using System.Configuration 语句,并添加一个程序集引用,因为我的数据项目没有引用这个 dll。谢谢!
【解决方案2】:

因为即使有帖子我也很难设置这个是完整的版本

project1(天蓝色函数): local.settings.json

  {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
        "schedule": "*/1 * * * * *"
      },
      "ConnectionStrings": {
        "dbEntities": "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='data source=someAzureServer.database.windows.net;initial catalog=someDB;persist security info=True;user id=foo;password=XXXX;MultipleActiveResultSets=True;App=EntityFramework'",
        "ProviderName": "System.Data.EntityClient"
      }

    }

项目2(dll): Model1.Context.cs

namespace main2
{
    using System;
    using System.Configuration;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class dbEntities : DbContext
    {
        public crypto_dbEntities()
            : base(ConfigurationManager.ConnectionStrings["dbEntities"].ConnectionString)
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
}

现在重命名: -连接字符串名称 -服务器名称 -db 名称 -用户名 -密码

所以我以后也记得;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多