在添加迁移期间忽略引用程序集中的实体
本文关键字:程序集 程序 集中 实体 引用 迁移 添加 | 更新日期: 2023-09-27 17:52:41
我有一个项目,我的域在一堆单独的程序集和DbContexts之间分裂,所有使用相同的底层Sql Server数据库。除了一个例外,这些程序集不能相互引用——有一个程序集包含可以称为共享实体的内容,这些内容对所有其他域都是通用的,有时作为导航属性引用。简化的例子:
// Shared.dll
namespace Shared
{
// Shared POCO
class Hero
{
public string Name { get; set; }
public string Description { get; set; }
}
class MyDbContext : DbContext
{
public virtual DbSet<Hero> Heroes { get; set; }
}
internal sealed class MyDbContextConfiguration : DbMigrationsConfiguration<MyDbContext>
{
public MyDbContextConfiguration ()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = @"Migrations'MyDbContext";
ContextKey = "Shared";
}
}
}
// Game.dll <- references Shared.dll
namespace Game
{
// Individual POCO
class Mission
{
public string Name { get; set; }
public virtual ICollection<Hero> Protagonists { get; set; }
}
class MyDbContext : DbContext
{
public virtual DbSet<Mission> Missions { get; set; }
}
internal sealed class MyDbContextConfiguration : DbMigrationsConfiguration<MyDbContext>
{
public MyDbContextConfiguration ()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = @"Migrations'MyDbContext";
ContextKey = "Game";
}
}
}
问题是,当我通过ICollection<Hero> Protagonists
导航属性在Game.dll组装模型中引用Hero
POCO时,调用:
add-migration Test -ProjectName:Game -ConfigurationTypeName MyDbContextConfiguration -StartUpProjectName Main
最终创建DbMigration,其中包括从引用的Shared.dll程序集对Hero
实体的更改。
public partial class Test : DbMigration
{
public override void Up()
{
AddColumn("shared.Heroes", "Name", c => c.String());
AddColumn("shared.Heroes", "Description", c => c.String());
...
我如何将add-migration
限制为仅监视位于定义DbContext的程序集中的实体的更改?换句话说,当对Games.dll运行add-migration
时,我想忽略对Shared.dll中的实体所做的任何更改。
还可以通过名称空间或数据库对象来限制模式。我只是不希望对位于引用程序集中的实体的任何更改包含在我的迁移中,因为所有的迁移都是按程序集维护的。
我有一个技巧,它很容易,你可以使用它(通过使用modelBuilder)。在MyDbContext中忽略),如果你熟悉有界上下文,那么这对你来说应该不是什么新鲜事:
你DbContext: public class MyDbContext : DbContext
{
private readonly bool _isMigrationMode;
public MyDbContext()
{
// This used by migration default and you can give the connection string in the command line.
_isMigrationMode = true;
}
// isMigrationMode: I have give it here as an optional parameter, in case, if you want to create the migration from the code.
public MyDbContext(string connectionString, bool isMigrationMode = false)
: base("name=" + connectionString)
{
_isMigrationMode = isMigrationMode;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (_isMigrationMode)
{
modelBuilder.Ignore<Hero>();
}
base.OnModelCreating(modelBuilder);
}
public DbSet<Mission> Missions { get; set; }
}
现在你可以像这样从命令行添加迁移:
add-migration FirstDb -ConfigurationTypeName Configuration -CONNECTIONSTRINGNAME YourConnectionString
这是您在示例
中使用的类似实体的输出。 public partial class FirstDb : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Missions",
c => new
{
MissionId = c.Long(nullable: false, identity: true),
Amount = c.Int(nullable: false),
Amount2 = c.Int(nullable: false),
HeroId = c.Long(nullable: false),
})
.PrimaryKey(t => t.MissionId);
}
public override void Down()
{
DropTable("dbo.Missions");
}
}