如何为脚手架注册自定义EF Code First迁移操作?

5

我有一个class SetIdentitySeedOperation: MigrationOperation,它为指定的表设置标识值。为了连接它,我使用自定义的SqlServerMigrationSqlGenerator,所以如果我在迁移的void Up()中手动编写.AddOperation(new SetIdentitySeedOperation(...)),我的Generate方法将被调用,并在那里生成适当的SQL。

有什么机制可以将这个自定义操作注册到迁移脚手架中,以便在进行Add-Migration时生成添加此操作的代码?


更新:我一直在查看EF迁移源代码,似乎用于脚手架的迁移操作列表来自对EdmModelDiffer.Diff()的调用,而EdmModelDiffer是内部的,因此似乎无法将自己的约定或属性插入到脚手架引擎中。

考虑到这一点,迁移操作和SQL生成的公共表面似乎毫无意义,因为它并没有为库用户提供真正的可扩展性点,需要用户手动编写显式调用他们的自定义迁移操作的代码,而那还要在编写一些样板代码将它们的SQL生成包装成操作之后才行。

所以,这个整个机制只有在同一段代码面向不同的数据库时才有用吗?

1个回答

3
现在,EF 6.1可以实现这一点: Code First Annotations允许您在表和列上设置注释,然后通过扩展SqlServerMigrationSqlGenerator来钩入脚手架操作,并根据您设置的属性更改脚手架。

我经常使用这种方法,它可以完成工作。我的做法是为我的映射文件创建扩展,以便更容易地添加自定义功能。对于问题中的用例,我建议使用SetIdentitySeed(100)之类的东西。这将转换为HasTableAnnotation("SetIdentitySeed", 100);并且从自定义SQL服务器生成器中,您将检查是否存在此注释,例如if(operation.Annotations.ContainsKey("SetIdentitySeed"))... - Francesc Castells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接