我正在尝试使用 MVC5 使用 Code First Migration 和 OWIN Identity 2 为用户和角色设定种子。在升级到 2.0 之前,我已经完成了这项工作。
首先,当使用DropCreateDatabaseIfModelChanges的非代码优先迁移示例时,以下工作
IdentityConfig.cs 文件中的 ApplicationDbInitializer 类:
public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
{
protected override void Seed(ApplicationDbContext context)
{
InitializeIdentityForEF(context);
base.Seed(context);
}
public static void InitializeIdentityForEF(ApplicationDbContext db)
{
var userManager = HttpContext
.Current.GetOwinContext()
.GetUserManager<ApplicationUserManager>();
var roleManager = HttpContext.Current
.GetOwinContext()
.Get<ApplicationRoleManager>();
const string name = "admin@admin.com";
const string password = "Admin@123456";
const string roleName = "Admin";
//Create Role Admin if it does not exist
var role = roleManager.FindByName(roleName); …Run Code Online (Sandbox Code Playgroud) 在删除列的迁移操作期间,如何在尝试删除列之前先生成 SQL 以检查该列是否存在?
对于删除列操作,实体框架当前生成这样的 sql 来删除列:
// Migration Operation:
DropColumn("dbo.Table", "Column");
// TSQL generated:
// Dependency management logic ...
ALTER TABLE [dbo].[Table] DROP COLUMN [Column]
Run Code Online (Sandbox Code Playgroud)
如何更改 SQL 以首先检查列是否存在:
// Migration Operation:
DropColumn("dbo.Table", "Column");
// TSQL desired:
IF EXISTS (SELECT * FROM sys.columns WHERE object_id = Object_id('dbo.Table') AND name = 'Column')
BEGIN
// Dependency management logic ...
ALTER TABLE [dbo].[Table] DROP COLUMN [Column]
END
Run Code Online (Sandbox Code Playgroud)
我知道可以通过继承自SqlServerMigrationSqlGenerator. 我这样做的尝试未能将默认放置列逻辑包装在一个IF块中。请参阅下面的示例:
public class CustomSqlServerMigrationSqlGenerator: SqlServerMigrationSqlGenerator
{
/// <summary>
/// Drop column only …Run Code Online (Sandbox Code Playgroud) entity-framework sql-generation ef-code-first entity-framework-6 entity-framework-migrations
我无法在实体属性上使用 [NotMapped] 属性,因为迁移添加命令会引发以下错误;
这是我的 POCO;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Domain.Entities
{
public partial class Employer
{
public int EmployerId { get; set; }
public bool? Blacklisted { get; set; }
[NotMapped]
public int TestProperty { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的异常消息。
System.ArgumentNullException: Value cannot be null.
Parameter name: navigation
at Microsoft.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName)
at Microsoft.Data.Entity.Metadata.Conventions.Internal.ConventionDispatcher.OnNavigationAdded(InternalRelationshipBuilder relationshipBuilder, Navigation navigation)
at Microsoft.Data.Entity.Metadata.Internal.InternalRelationshipBuilder.Relationship(InternalEntityTypeBuilder principalEntityTypeBuilder, InternalEntityTypeBuilder dependentEntityTypeBuilder, String navigationToPrincipalName, String navigationToDependentName, IReadOnlyList`1 dependentProperties, IReadOnlyList`1 principalProperties, Nullable`1 isUnique, Nullable`1 …Run Code Online (Sandbox Code Playgroud) c# entity-framework entity-framework-core asp.net-core entity-framework-migrations
当我第一次运行Enable-Migrations我的项目时,它Migrations在项目根目录下创建了一个文件夹。然后,我将该Migrations文件夹移动到我的文件夹下Data,其中包含上下文和模型等。然后我更正了两个已应用的迁移中的名称空间。
然后我尝试使用 进行第三次迁移Add-Migration IdToLong,并收到错误消息:
无法生成显式迁移,因为以下显式迁移处于待处理状态:[201703061039495_Initial、201703061159110_ContactRequest]。在尝试生成新的显式迁移之前应用挂起的显式迁移。
我能想到的唯一原因是 EF 存储了连接字符串位置的相对路径,而该路径现在毫无用处。我见过一些报告,表明 EF 在无法连接到数据库时显示相同的消息。
EF 的这种隐藏存储/配置与我们使用 EF Core 的方向背道而驰,我真的希望这个问题不会出现在那里。
接下来回答我的问题,当我移动MigrationsEF 以便 EF 无法再看到我已经应用了这些迁移时,发生了什么变化或没有发生变化?
c# entity-framework entity-framework-6 entity-framework-migrations
我创建了一个桌面应用程序,它使用SQL CE 4.0和具有Code First模式的实体 框架。所以,最初我在系统上安装了应用程序,它运行良好。
现在,我向模型类添加了一些属性,因此为此目的,我使用 启用了迁移Enable-Migrations,并使用Add-Migration "MyMigration". 这也很成功,我能够安装新版本并升级数据库,没有任何问题。
但是现在,当我在没有现有数据库的系统上安装此设置时,它会失败,所以经过研究,我意识到我需要添加初始迁移所以,我撤销了模型中的更改,还删除了我的 SQLCE 数据库文件,添加了初始迁移,然后Update-Database。因此,如果我尝试使用在未启用迁移的情况下创建的旧数据库来更新数据库,那么它会失败,它会尝试将初始迁移应用于数据库,但根据我的说法,它不应该这样做。
现在,如果我删除旧数据库文件,然后删除更新数据库,则会创建新数据库,然后再次将我的更改添加到模型并添加预期迁移。
因此,在此之后,周转我可以在空白系统上安装我的应用程序,但它在具有旧数据库的系统上失败,即它不会升级数据库。
它也尝试应用初始迁移,即再次创建所有表,但失败并提示“该表已存在,这是意外的”。
c# entity-framework sql-server-ce ef-code-first entity-framework-migrations
我正在尝试使用 EntityFramework Codefirst 和 Oracle 数据库创建一个独立于架构的模型,但 EF 使用 dbo 作为迁移的默认值作为架构。我重写了 DBContext 上的 OnModelCreating 方法来解决此问题,并在 connectionString 中使用用户
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema(string.Empty);
}
Run Code Online (Sandbox Code Playgroud)
问题是 __MigrationHistory 忽略此默认架构,并且在运行第一次迁移时出现此错误:
ORA-01918: 用户 'dbo' 不存在
尝试使用此 msdn 条目来自定义该表的架构。
自定义历史上下文:
public class CustomHistoryContext : HistoryContext
{
public CustomHistoryContext(DbConnection dbConnection, string defaultSchema)
: base(dbConnection, defaultSchema) {}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema(String.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
和数据库配置:
public sealed class Configuration :
DbMigrationsConfiguration<Model.MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
(connection, defaultSchema) …Run Code Online (Sandbox Code Playgroud) 使用 Entity Framework Core 2.0,如果我的应用程序需要能够针对这两种类型,我如何在同一解决方案中保留 Microsoft SQL Server 和 Postgres 的迁移?就我而言,如果在 MacOS 上运行,我想使用 Postgres,如果在 Windows 上运行,我想使用 SQL Server。在设置 DataContext 之前,我们使用调用“RuntimeInformation.IsOSPlatform(..)”来确定平台并提取适当的连接字符串。
目前,该解决方案分为一个 ASP.NET Core 项目和一个“Data”项目,该项目仅保留 SQL Server 的 DataContext 和迁移。
到目前为止,我的尝试失败了:
为迁移创建单独的项目,一个用于 SQL Server 迁移,一个用于 Postgres 迁移。然后运行“ef migrations add ...”,其中“-p”参数指向我要使用的迁移项目。这是结合调用“.UseNpgsql(connectionString, o => o.MigrationsAssembly(..)”或“.UseSqlServer(connectionString, o => o.MigrationsAssembly(..)”)来完成的。工具会失败。抱怨没有找到 DataContext。
与“1”相同。但我们还在每个迁移项目中添加了一个实现“IDesignTimeDbContextFactory<..>”的类。此操作失败,工具抱怨没有找到 DataContext。
将 SQL Server 迁移保留在与 DataContext 相同的项目中。调用“ef migrations add ..”,并使用“-o”参数指定 Postgres 迁移的另一个输出文件夹。这适用于 SQL Server 迁移,但对于 Postgres 迁移会失败,因为它不喜欢同一项目中存在同名的迁移(即使它位于另一个文件夹中),而且迁移是为SQL Server 而不是 Postgres,即使它们放在指定的文件夹中。
这是当前不支持的场景吗?我们应该在所有平台上坚持使用 Postgres 吗?(这确实有效)。
sql-server postgresql entity-framework-core entity-framework-migrations
作为 EF 迁移的新手,我对以下行为感到惊讶,并想知道它是否是故意的(即有一个开关可以让它消失)。
当我重命名列时,EntityTypeConfiguration 类中有以下相关行:
Property(x => x.MyColumn).HasColumnName(@"MyColumn").HasColumnType("nvarchar").IsOptional();
Run Code Online (Sandbox Code Playgroud)
而且,至关重要的是:
HasOptional(a => a.RelatedTable).WithMany(b => b.ThisTable).HasForeignKey(c => c.MyColumn).WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
据我了解,这是建立外键关系。当我将 MyColumn 重命名为 MyColumn2 时,创建的迁移如下所示:
public override void Up()
{
RenameColumn(table: "dbo.ThisTable", name: "MyColumn", newName: "MyColumn2");
RenameIndex(table: "dbo.ThisTable", name: "IX_MyColumn", newName: "IX_MyColumn2");
}
Run Code Online (Sandbox Code Playgroud)
但是,MyColumn未在 上建立索引ThisTable。我意识到为外键关系创建索引是明智的;这就是 EF 假设有一个的原因吗?
请注意,EF 模型最初是使用 EF 反向 POCO 生成器从数据库生成的。
c# entity-framework ef-database-first entity-framework-migrations
所以,我有一个带有这样的道具的模型:
public DateTime Date { get; set; }
Run Code Online (Sandbox Code Playgroud)
我尝试为此字段设置默认值,如下所示:
modelBuilder.Entity<Record>().Property(r => r.Date).HasDefaultValueSql("NOW()");
Run Code Online (Sandbox Code Playgroud)
问题是未设置数据库列默认值。当我使用“NOW()”函数时,迁移有效,但正如我所说,数据库中未设置列默认值。当我尝试其他 MySql 日期时间函数时,我收到此错误:
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本对应的手册,了解在第 1 行 '' 附近使用的正确语法
我在这里缺少什么?
mysql entity-framework entity-framework-core ef-core-2.0 entity-framework-migrations
我的公司正在转向微服务,作为这一转变的一部分,devops 正在使用 VSTS 和 GIT 在 Azure 中建立 CI/CD 构建发布管道。
当前管理迁移的模型是为开发人员提供 2 个独立 git 存储库中的 2 个项目。
项目 1 - API 服务项目 - .NET Framework / .Net Core
项目 2 - 使用迁移 API 基于 EF6 的数据库项目
这些项目具有基于存储库的完全独立的发布管道。因此,当您向 master 创建拉取请求时,管道会构建并发布项目。
这个新架构还支持蓝绿部署,我们的应用程序服务在多个节点上运行。
我们遇到的问题是,通过这种设置,我们基本上必须手动编写迁移代码,并且无法使用 EF Core 中提供的任何工具。
我读过的大多数文章和文档都显示从应用程序启动时运行迁移,但是如果您有多个应用程序服务节点,如何防止 2 个节点运行迁移?
我看过的其他文章显示了将迁移移动到一个单独的项目中,但该项目需要引用其中包含 dbcontext 的项目。在我公司的设置中这是不可能的。我们也不能做相反的事情,因为将 dbcontext 移动到数据库项目中会阻止我们在 api 服务项目中引用它。
有什么办法可以让 EF Core 支持这个模型吗?
在多节点应用服务上使用 EF Core 迁移实现蓝绿部署的首选方法是什么?
entity-framework-migrations ×10
c# ×5
ef-core-2.0 ×2
asp.net-core ×1
mysql ×1
oracle ×1
owin ×1
postgresql ×1
sql-server ×1