C# 多租户代码优先迁移上的多DbContext
您好,我有一个与webapi在多个api上共享的系统,每个api都有一个带有Entity Framework 6的DbContext,它使用单个dll作为模型的引用 示例模型产品可以从具有相应DbContext的invoiceapi项目中的InvoiceItem引用 相同的产品模型也可以由commercialapi中的OrderItem模型引用,该模型也具有DbContext 我怀疑当我在BaseApi项目上运行DbContext迁移时,我的数据库已更新或创建,但当在InvoiceApi上运行迁移时,我收到一个错误,即Produto对象已存在 这个系统有几个api,每个api都有一个连接在同一模式和数据库中的Datacontext。我怀疑是否有一种方式,迁移只会在同一模式和数据库中升级其Datacontext的模型?这是一种不创建包含所有模型的单独DataContext项目的方法吗 对不起,英语不好C# 多租户代码优先迁移上的多DbContext,c#,asp.net,entity-framework-6,asp.net-web-api2,C#,Asp.net,Entity Framework 6,Asp.net Web Api2,您好,我有一个与webapi在多个api上共享的系统,每个api都有一个带有Entity Framework 6的DbContext,它使用单个dll作为模型的引用 示例模型产品可以从具有相应DbContext的invoiceapi项目中的InvoiceItem引用 相同的产品模型也可以由commercialapi中的OrderItem模型引用,该模型也具有DbContext 我怀疑当我在BaseApi项目上运行DbContext迁移时,我的数据库已更新或创建,但当在InvoiceApi上运行迁
//Project ApiModels(this project has only the Models, this models are shared to others projects
public class Produto
{
[Key]
public int Id {get;set;}
public string Nome {get;set;}
}
public class ItemNota
{
[Key]
public int Id {get;set;}
public int ProdutoId { get;set;}
public virtual Produto Produto { get;set;}
}
public class OrderItem
{
[Key]
public int Id {get;set;}
public int ProdutoId { get;set;}
public virtual Produto Produto { get;set;}
}
//Project BaseApi this project has the webapi of the basic datas like products, clients, here i enabled the migrations and referenced the apiModels dll
public class DataContext : DbContext, IDbContext
{
public DataContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer(new DataContextInitializer());
}
public DataContext()
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public DbSet<Contador> Contador { get; set; }
public DbSet<Parametro> Parametro { get; set; }
public DbSet<Participante> Participante { get; set; }
public DbSet<Produto> Produto { get; set; }
public DbSet<UniMed> UniMed { get; set; }
}
public class DataContextInitializer : IDatabaseInitializer<DataContext>
{
public void InitializeDatabase(DataContext context)
{
Configuration cfg = new Configuration(); // migration configuration class
cfg.AutomaticMigrationsEnabled = true;
cfg.AutomaticMigrationDataLossAllowed = false;
cfg.TargetDatabase =
new DbConnectionInfo(
context.Database.Connection.ConnectionString,
"System.Data.SqlClient");
DbMigrator dbMigrator = new DbMigrator(cfg);
dbMigrator.Update();
}
}
//项目ApiModels(此项目只有模型,此模型共享给其他项目
公共类产品
{
[关键]
公共int Id{get;set;}
公共字符串Nome{get;set;}
}
公共类项目
{
[关键]
公共int Id{get;set;}
public int ProdutoId{get;set;}
公共虚拟Produto Produto{get;set;}
}
公共类OrderItem
{
[关键]
公共int Id{get;set;}
public int ProdutoId{get;set;}
公共虚拟Produto Produto{get;set;}
}
//Project BaseApi此项目具有产品、客户端等基本数据的webapi,这里我启用了迁移并引用了apiModels dll
公共类DataContext:DbContext,IDbContext
{
公共数据上下文(字符串连接字符串)
:基本(连接字符串)
{
SetInitializer(新的DataContextInitializer());
}
公共数据上下文()
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
}
公共DbSet Contador{get;set;}
公共DbSet参数{get;set;}
公共DbSet Participante{get;set;}
公共DbSet Produto{get;set;}
公共DbSet UniMed{get;set;}
}
公共类DataContextInitializer:IDatabaseInitializer
{
public void InitializeDatabase(DataContext上下文)
{
Configuration cfg=new Configuration();//迁移配置类
cfg.AutomaticMigrationsEnabled=true;
cfg.AutomaticMigrationDataLossAllowed=false;
cfg.TargetDatabase=
新数据库连接信息(
context.Database.Connection.ConnectionString,
“System.Data.SqlClient”);
DbMigrator DbMigrator=新的DbMigrator(cfg);
dbMigrator.Update();
}
}
//项目InvoiceApi此项目具有发票数据的webapi,在这里我启用了迁移并引用了apiModels dll
public class DataContext : DbContext, IDbContext
{
public DataContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer(new DataContextInitializer());
}
public DataContext()
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public DbSet<Invoice> Invoice { get; set; }
public DbSet<InvoiceItem> InvoiceItem { get; set; }
}
public class DataContextInitializer : IDatabaseInitializer<DataContext>
{
public void InitializeDatabase(DataContext context)
{
Configuration cfg = new Configuration(); // migration configuration class
cfg.AutomaticMigrationsEnabled = true;
cfg.AutomaticMigrationDataLossAllowed = false;
cfg.TargetDatabase =
new DbConnectionInfo(
context.Database.Connection.ConnectionString,
"System.Data.SqlClient");
DbMigrator dbMigrator = new DbMigrator(cfg);
dbMigrator.Update();
}
}
公共类DataContext:DbContext,IDbContext
{
公共数据上下文(字符串连接字符串)
:基本(连接字符串)
{
SetInitializer(新的DataContextInitializer());
}
公共数据上下文()
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
}
公共数据库集发票{get;set;}
公共数据库集InvoiceItem{get;set;}
}
公共类DataContextInitializer:IDatabaseInitializer
{
public void InitializeDatabase(DataContext上下文)
{
Configuration cfg=new Configuration();//迁移配置类
cfg.AutomaticMigrationsEnabled=true;
cfg.AutomaticMigrationDataLossAllowed=false;
cfg.TargetDatabase=
新数据库连接信息(
context.Database.Connection.ConnectionString,
“System.Data.SqlClient”);
DbMigrator DbMigrator=新的DbMigrator(cfg);
dbMigrator.Update();
}
}
请显示重现问题的代码。等等-您只是想管理具有多个数据上下文的迁移吗?是的,但我在ApiBase项目上运行了第一次迁移好的,它是创建或更新数据库,现在在invoiceapi项目上运行迁移时,我收到一个错误,即Produto对象已经存在,并且确实存在k:两个上下文的名称完全相同-这是一个拼写错误吗?我有一种管理多个上下文的方法,但是我不确定当上下文共享相同的名称时它的效果如何。使用包管理器控制台非常容易-你认为这可能有帮助吗?相同的上下文名称但不同的项目…我更改了上下文名称,但我仍然我有同样的错误,我认为这是不可能的,我必须创建一个与其他API项目的上下文共享的分离项目。我想在微环境中划分上下文,以考虑将来改变API技术的可能性,并考虑干模式。请显示复制问题的代码。等待。-您只是想管理具有多个数据上下文的迁移吗?是的,但我在ApiBase项目上运行了第一次迁移好的,它是创建或更新数据库,现在在invoiceapi项目上运行迁移时,我收到一个错误,即Produto对象已经存在并且非常快:两个上下文的名称完全相同-这是一个错误吗输入错误?我有一种管理多个上下文的方法,但是我不确定当上下文共享相同的名称时它有多有效。使用Package Manager控制台很容易-你认为这可能有帮助吗?相同的上下文名称但不同的项目…我更改了上下文名称,但仍然有相同的错误,我认为这是不可能的,我必须为与其他api项目共享此内容的上下文创建一个单独的项目