gpt4 book ai didi

c# - Entity Framework 使用 IdentityDbContext 和代码优先自动迁移表位置和模式?

转载 作者:太空狗 更新时间:2023-10-29 20:36:24 29 4
gpt4 key购买 nike

我正在尝试使用 IdentityDbContext 类设置自动迁移更新,并将更改传播到整个数据库的实际 DbContext。

在我进入代码之前,在我使用自动迁移实现 IdentityDbContext 时,我得到了这个错误:

Automatic migrations that affect the location of the migrations history system table (such as default schema changes) are not supported. Please use code-based migrations for operations that affect the location of the migrations history system table.

我不会发布与迁移和上下文代码相关的模型,除非有人发现它们有用。

IdentityDbContext 的实现:

 public class SecurityContext: IdentityDbContext<User>
{
public SecurityContext() : base("MyActualContext")
{

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{


base.OnModelCreating(modelBuilder);

//removing this line I do not get an error, but everything gets placed into the dbo schema. Keeping this line, i get the above error.
modelBuilder.HasDefaultSchema("ft");
}
}

所以我尝试添加此类以将迁移历史记录放入正确的模式中。事实上,这确实将迁移历史移到了正确的架构中,但其他所有内容都保留在 dbo 架构中。

public class MyHistoryContext : HistoryContext
{
public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
: base(dbConnection, defaultSchema)
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema("ft");
}
}

public class SecurityContextMigrations : DbMigrationsConfiguration<SecurityContext>
{
public SecurityContextMigrations()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
//When the migrations get set, I use the new class created to move the migrations to the correct schema.
SetHistoryContextFactory("System.Data.SqlClient", (c, s) => new MyHistoryContext(c, s));
}

protected override void Seed(SecurityContext context)
{
...
}
}

理想情况下,我希望所有内容都在 ft 模式中。我认为迁移不需要手动设置迁移那么复杂。我希望为简单起见,我可以为此使用自动迁移。我想知道这种方法是否不可能,我需要做什么才能实现这一点,并且对模型所做的任何更改都会得到传播。

最佳答案

我对 Oracle 12c 和 EF6 也有类似的问题:我无法让自动迁移工作。但是,我发现以下部分成功因素:- 我需要设置

modelBuilder.HasDefaultSchema("")

为了让运行时在我的 DbContext 上看到特定用户的登录模式中的表 - 对于更新数据库,必须像这样设置 MyHistoryContext 参数:

public class MyHistoryContext : HistoryContext
{
public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
: base(dbConnection, defaultSchema)
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema("L2SRVRIZ");
}
}

注意:您需要在那里硬编码架构名称。这样,update-database 就不会尝试将 dbo 用作模式(但仍然无法进行自动迁移,它们会删除您的 MigrationHistory 表并弄乱所有内容)。在我看来,这是 EF6 或 Oracle 自定义类中的一个严重错误。由于我没有与他们签订维护契约(Contract),因此我无法提交工单。

对于您的情况,我认为设计上不可能以某种方式避免自动迁移出现错误消息。出于某种原因,EF6 认为如果您使用自定义架构名称,您实际上是从默认 dbo 架构中移动了 __MigrationHistory 表,这当然不是真的。

或者,您找到解决方案了吗?

BR 弗洛里安

关于c# - Entity Framework 使用 IdentityDbContext 和代码优先自动迁移表位置和模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361700/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com