Функции Azure: может компилироваться, но не может работать с пользовательской библиотекой уровня данных - PullRequest
0 голосов
/ 01 мая 2018

Я пытался придумать лучший заголовок, но не могу.

Проблема в том, что я новичок в функциях Azure, но выполнил простую работу по записи в таблицу SQL Azure. Теперь я попытался построить самый простой вид Datalayer на основе Entity Framework и загрузил его. Сейчас он скомпилирован как .Net 4.6 и использует EF 6.1.3.

Я использую строку подключения согласно второму ответу здесь Второй ответ и проверил, что он корректно извлекается. Обновление - я также использовал это руководство .

Удаление этого {#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());
            }
        }

Это функция.json:

   {

    "frameworks": {

        "net46":{
                    "dependencies": {

                        "EntityFramework": "6.1.3"
                    }
                }
    }

}

Я сам скомпилировал dll для .Net 4.6 после подозрения, что функции Azure не поддерживают .net 4.7.1, и через Kudu загрузил скомпилированную dll в папку sharedbin (проверял путь десятки раз!) .

Это ошибка, выдаваемая:

    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 в настройках приложения, поскольку я обнаружил, что жизнь стала намного сложнее, если я перешел на бета-версию.

Если кто-нибудь может указать мне рабочее руководство для этого варианта использования (сначала База данных, EF 6.1.3 и т. Д.), Я был бы благодарен.

Любая помощь предлагается с благодарностью!

Спасибо:)

1 Ответ

0 голосов
/ 03 мая 2018

Перейдите на портал Azure, создайте папку с именем «bin» в функциях Azure с помощью оболочки CMD, загрузите файл «TestDataLayer.dll» в папку bin, которая только что была создана.

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

Структура проекта должна выглядеть,

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

Функции Azure должны быть в состоянии обнаружить вашу библиотеку на этот раз. Я считаю, EntityFramework работает просто отлично.

...