c# - 使用同一个数据库为多个 DbContext 创建表

标签 c# entity-framework asp.net-core entity-framework-core

我正在尝试针对同一个数据库实现多个 DbContext。

它在第一个 DbContext 对象上调用 DataBase.EnsureCreated() 时起作用,但它不会为其余对象创建表。 在 Init.Initalize() 之后,我希望数据库包含两个名为 Clients 和 Addresses 的表

初始化数据库:

public static class Init
{
    public static void Initalize(BaseDbContext[] contexts, Config.Options.Environments environment)
    {                     
        if (environment == Config.Options.Environments.Development)
        {
            contexts[0].Database.EnsureDeleted();

            foreach(BaseDbContext context in contexts)
            {
                context.Database.EnsureCreated();
            }

            var clients = new Client[]
            {
                new Client() { Key = Guid.NewGuid(), Name = "Smokers.no", DisplayName = "Smokers.no", Email = "post@smokers.no", LogoFilename = "logo.jpg" }
            };

            foreach(BaseDbContext context in contexts)
            {
                if (context.GetType().Equals(typeof(Data.SharedDbContext)))
                {
                    var cntx = context as Data.SharedDbContext;
                    foreach (Client client in clients) { cntx.Clients.Add(client); }
                    cntx.SaveChanges();
                }
            }


        }
        else
        {
            foreach(BaseDbContext context in contexts)
            {
                context.Database.EnsureCreated();

                if (context.GetType().Equals(typeof(Data.SharedDbContext)))
                {
                    var cntx = context as Data.SharedDbContext;

                    if (cntx.Clients.Any())
                    {
                        return;
                    }
                }
            }
        }
    }
}

BaseDbContext:

public class BaseDbContext : DbContext
{
    public BaseDbContext(DbContextOptions<BaseDbContext> options) : base(options) { }
}

SharedDbContext:

public class SharedDbContext : BaseDbContext
{
    public SharedDbContext(DbContextOptions<BaseDbContext> options) : base(options) { }

    #region DbSets
    public DbSet<Client> Clients { get; set; }
    #endregion
}

MailerDbContext:

public class MailerDbContext : BaseDbContext
{
    SharedDbContext _context;

    public MailerDbContext(DbContextOptions<BaseDbContext> options, SharedDbContext context) : base(options)
    {
        _context = context;
    }

    public SharedDbContext LCToolsContext
    {
        get
        {
            return _context;
        }
    }

    #region DbSets
    public DbSet<Address> Addresses { get; set; }
    #endregion
}

最佳答案

您是否尝试过定义一个配置,在其中为每个单独的上下文设置 ContextKey

例如:

public sealed class Configuration : DbMigrationsConfiguration<MyDataContext>
{
 public Configuration()
 {
   AutomaticMigrationsEnabled = false;
   ContextKey = "MySpecialKey";
 }

 //Seed method here..

}

这样调用它:

private static void InitializeDatabaseUsingEF()
{

  System.Data.Entity.Database.SetInitializer(
    new System.Data.Entity.MigrateDatabaseToLatestVersion<
      MyDataContext,
      Migrations.Configuration>("ConnectionString.PostgreSql (Npgsql)"));

  using (var db = new MyDataContext())
  {
    db.Database.Initialize(true);        
  }

}

关于c# - 使用同一个数据库为多个 DbContext 创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44265244/

相关文章:

.net - EF在父删除时将外键设置为空

c# - 将 XML 文档/注释添加到 EF 生成的类中的属性/字段

c# - 如何在不知道构建配置的情况下将 EXE 从 .net 核心应用程序的 bin 目录复制到 wwwroot?

asp.net - 将 ASP.NET 4 Razor "extensionless URLs"站点移植到 ASP.NET 5

c# - 在运行时更改其他项目的 app.config 值

c# - 如何将小数点四舍五入到用户给出的最接近的小数值?

c# - 3D 网格对象与 2D 平面的相交曲线

asp.net-mvc - Autofac (+MVC + EF + SignalR + Hangfire) 生命周期范围

asp.net-core - Microsoft.Extensions.Logging 类别的 Serilog 输出模板

c# - COM dll 的有效 .cs 文件