【发布时间】:2016-08-09 14:51:19
【问题描述】:
我有一组类A[1..n],它们都继承自抽象类B。这些A 实例中的每一个都只会添加一个属性 - 每个实例的外键映射到单独的表。每个外键列都有名称ForeignKeyId,而不是表的名称,所以基本上我有一组表,除了名称之外几乎相同。
我想编写一个存储过程,它使用一些特定的 SQL 分组、排序和连接等从这些表中加载记录。重要的部分不是查询本身,而是自动创建具有特定名称的存储过程无需在迁移本身中逐行手动添加(这是该问题中评价最高的答案: Create Stored Procedures using Entity Framework Code First?)。
我尝试在MigrationCodeGenerator 中创建额外的操作:
public override ScaffoldedMigration Generate( string migrationId,
IEnumerable<MigrationOperation> operations, string sourceModel,
string targetModel, string @namespace, string className )
{
IList<MigrationOperation> operationsList = operations as IList<MigrationOperation> ?? operations.ToList();
var drop = new DropProcedureOperation($"{className}_LoadVersion");
var create = new CreateProcedureOperation($"{className}_LoadVersion", $"select * from {className}");
operationsList.Add( drop );
operationsList.Add(create);
CSharpMigrationCodeGenerator generator = new CSharpMigrationCodeGenerator();
return generator.Generate( migrationId, operationsList, sourceModel, targetModel, @namespace, className );
}
但是,我的迁移完全是空的:
public partial class TestMigration : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
一旦我可以让生成器开始创建任何东西,我就可以从那里对其进行微调,但我不知道如何让它在迁移时创建存储过程。
【问题讨论】:
-
为什么需要在迁移时创建存储过程 在迁移过程中是否需要它们?您可以在 OnModelCreating 上创建它们,并且在调用迁移时将执行该方法?
-
@BassamAlugili 我不需要在迁移时创建它们,但我认为这是确保在新表上创建存储过程的最简单方法。我会考虑在模型创建时创建它们 - 但这些不是简单的对象加载,所以我不确定如何使用 ModelBuilder 构建它。
标签: c# entity-framework