EF代码首次迁移Azure功能项目

时间:2017-11-29 12:33:34

标签: c# entity-framework ef-code-first azure-sql-database azure-functions

我想在Azure函数项目中使用EF Code首次迁移,该项目是具有.net 4.6.2的类库EF 6.2.0。我添加了db上下文和实体。当我尝试通过将此类库设置为默认项目来运行enable-migrationsadd-migration,然后获得以下错误。我在解决方案中没有任何网络项目。

  

异常调用" SetData"用" 2"参数:"类型   ' Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject'   在assembly' Microsoft.VisualStudio.ProjectSystem.VS.Implementation中,   Version = 15.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'   没有标记为可序列化。"在   C:\用户\ XXXXX-win.nuget \包\的EntityFramework \ 6.2.0 \ TOOLS \ EntityFramework.psm1:720   焦炭:5   + $ domain.SetData(' project',$ project)   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:NotSpecified:(:) [],MethodInvocationException       + FullyQualifiedErrorId:SerializationException

但是当我运行项目时,它会自动创建带有__MigrationHistory条目的InitialCreate表。但我无法在解决方案的任何位置看到此迁移文件。

dbcontext文件供参考。

 public class TestDbContext : DbContext
    {
        public TestDbContext(string cs)
            : base(cs)
        {
        }

        public TestDbContext() :
            base(ConfigurationManager.ConnectionStrings["sql_connection"].ConnectionString)
        {
            Database.SetInitializer(new TestDBInitializer());
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TestRaw>().ToTable("TestRaw");
            modelBuilder.Entity<TestRequest>().ToTable("TestRequest");
        }

        public virtual DbSet<TestRaw> TestRaw { get; set; }

        public virtual DbSet<TestRequest> TestRequest { get; set; }

    }
    public class TestDBInitializer : CreateDatabaseIfNotExists<TestDbContext>
    {
        protected override void Seed(TestDbContext context)
        {
            base.Seed(context);
        }
    }

此外,azure函数不使用app.config。那么不确定注册EF相关依赖项的位置?我们可以使用EF代码首次迁移Azure功能吗?如果是,如何查看迁移文件夹和相关文件?在部署到functionapp时,我是否需要注意与迁移相关的任何事情?

1 个答案:

答案 0 :(得分:0)

我将这个答案分成两部分。

1)尝试启用/添加迁移时出现的错误(&#34;异常调用&#34; SetData&#34; ...&#34;)可能是由于目标框架不匹配导致的包含您的上下文和实体的项目以及您尝试使用的命令。虽然看起来,根据您的描述,您已经正确设置了这些,意思是:.net 4.6.2和EF 6.2.0(因此两者都不是.net核心)。

我设法通过为我的上下文和实体类创建.NET Standard 2.0类库,在其中安装EF 6.2并运行诸如&#34; enable-migrations&#34;之类的旧命令来获得相同的错误。等

Here是获得相同错误的其他一些原因(指向版本冲突并在包管理器控制台中设置正确的项目等)。

创建.NET Framework 4.6.2类库,安装EF 6.2并使用这些命令对我有用,并且一定对您有用。

因为您说运行应用程序实际上运行迁移(因为您设置了数据库初始化程序)会表明您可能只是在实际需要的时候使用旧命令&#34; dotnet ef ...& #34 ;.

您可能希望提供有关解决方案结构(针对哪些版本的项目)的更详细信息,以便进行进一步分析。

作为旁注,Azure Functions现在也支持.NET Core,因此您可能希望一直尝试.NET Core(意味着函数项目,类库和EF都是Core的目标)。 / p>

2)Azure功能和EF支持:无法阻止您在Azure功能中使用EF。我刚刚创建了EF Code First迁移(EF 6.2)和数据库初始化程序集的函数,以便在运行时将db迁移到最新版本。

我在一个项目中有函数,数据库上下文和另一个类库项目中的实体,其中也包含app.config文件(仅用于创建迁移或手动更新数据库等)。然后,只需在函数项目中引用该项目即可使用其中的代码。

在函数内部,您只需创建上下文类的新实例。您可以使用基本ConfigurationManager.ConnectionStrings["foobarConnString"].ConnectionString(或等效的.NET Core代码,如果定位Core)获取数据库连接字符串。

当然,这意味着您需要在函数项目和模型项目中引用EF库。