Azure功能:可以编译但无法使用自定义数据层库运行

时间:2018-05-01 11:15:14

标签: entity-framework azure azure-functions

我试图想出一个更好的头衔,但不能。

问题是我是Azure功能的新手,但做了一个简单的工作,写入SQL Azure表。现在,我尝试构建最简单的基于实体框架的Datalayer并上传它。现在它被编译为.Net 4.6并使用EF 6.1.3。

我按照Second answer的第二个答案使用了连接字符串,并检查了它是否正确检索。 更新 - 我还使用了this guide

删除此{#r" D:\ home \ site \ wwwroot \ _ sharedbin \ TestDataLayer.dll"}会导致编辑器抱怨缺少程序集,因此它正在查找有问题的dll。

但是它不会运行 - 它找不到TestDataLayer.dll。

我只在门户网站编辑器中运行它(我还没有直接从Visual Studio项目中掌握部署 - 不要笑:P)。

#r "System.Configuration"
#r "System.Data.Entity"
#r "D:\home\site\wwwroot\sharedbin\TestDataLayer.dll"

using System;
using System.Collections;
using System.Configuration;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity.SqlServer;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.Net;
using TestDataLayer;

public static void Run(TimerInfo myTimer, TraceWriter log)
    {
       var connection =  ConfigurationManager.ConnectionStrings["sql_connection"].ConnectionString; 
       using(var db = new SyncDbContext(connection))
            {
                var RK = new RKAzureTest()  {TestField1 = "It finally worked?" };
                db.RKAzureTests.Add(RK);
                db.SaveChanges();
            }
    }       

[DbConfigurationType(typeof(myDBContextConfig))] 
public partial class SyncDbContext : System.Data.Entity.DbContext
{
    public SyncDbContext(string cs) : base(cs) {}
    public DbSet<RKAzureTest> RKAzureTests {get;set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
 //       modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

}

    public  class myDBContextConfig : DbConfiguration
        {
            public myDBContextConfig()
            {
                SetProviderServices("System.Data.EntityClient", 
                System.Data.Entity.SqlServer.SqlProviderServices.Instance);
                SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.SqlConnectionFactory());
            }
        }

这是function.json:

   {

    "frameworks": {

        "net46":{
                    "dependencies": {

                        "EntityFramework": "6.1.3"
                    }
                }
    }

}

我怀疑Azure Functions不支持.net 4.7.1并通过Kudu将已编译的dll上传到sharedbin文件夹(检查路径a)后,我已将dll本身编译为.Net 4.6十几次!)。

这是抛出的错误:

    2018-05-01T11:00:00.012 [Warning] Unable to find assembly 'TestDataLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Are you missing a private assembly file?
2018-05-01T11:00:00.012 [Error] Exception while executing function: Functions.TimerTriggerCSharp1. mscorlib: Exception has been thrown by the target of an invocation. f-TimerTriggerCSharp1__514732255: Could not load file or assembly 'TestDataLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

不太确定还剩下什么 - 我在应用程序设置中使用运行时版本1.0.11702,因为我发现如果我进入Beta版本,生活会变得更复杂。

如果有人能指出这个用例的工作指南(数据库优先,EF 6.1.3等),我将不胜感激。

感谢所提供的任何帮助!

谢谢:)

1 个答案:

答案 0 :(得分:2)

转到Azure门户,创建一个名为“&#39; bin&#39;在使用CMD Shell的Azure功能中,上传&#39; TestDataLayer.dll&#39;刚刚创建的文件到bin文件夹。

#r "System.Configuration"
#r "System.Data.Entity"
#r "TestDataLayer.dll"

项目结构应该如下,

AzureFunctionProjectName001
    bin
       TestDataLayer.dll
    run.csx
    project.json
    project.lock.json
    ...

这次Azure功能应该能够发现您的库。我相信,EntityFramework工作正常。