我最近开发了一个相当大的插件,看到了很多变化 始终。不得不手动放下后我问自己这个问题 我忘了在
Uninstall()
方法中添加表格。
我正在构建一个nopCommerce插件,我想让我的PluginNameObjectContext.Uninstall()
方法更灵活。
我关注Alex Wolf's tutorial *,目前看起来像是:
this.DropPluginTable("firstTable");
this.DropPluginTable("secondTable");
....
this.DropPluginTable("nthTable");
有很多地方需要在代码中反映对插件的数据访问层的更改。当我在插件域中添加或删除类时,我一直忘记更新此方法,这会导致错误,然后进行一些清理。
如何使这种方法更具动态性,并减轻整个开发过程中的维护负担?
*视频系列适用于Nop 3.5,因此在技术上仅落后于0.2版本,但如果您是nopCommerce开发的新手,则绝对无价。他的blog也有一些非常有用的帖子。
答案 0 :(得分:0)
感谢MVC和NopCommerce倡导的Convention over Configuration
原则,我们可以利用一致的命名。
配置数据访问时遵循命名约定,特别是EntityTypeConfiguration<T Entity>
映射类。将所有ToTable()
方法设置为以插件名称开头,如下所示:
ToTable("PluginName_InterestingStuff");
HasKey(k => k.Id);
Property(p => p.Puppies);
...
这样,Install()
类中的ObjectContext
方法将生成以您的插件名称开头的SQL表:
dbo.PluginName_Foo
dbo.PluginName_Bar
如果您正确配置了代码优先类,则可能会有一些外键。按照设计,这些也将遵循命名约定,它们的名称将以您的插件名称开头。
通过在应用程序数据库中创建一个将删除包含@YourPluginName
的所有外键和表的存储过程来利用此功能。下面是SQL脚本,它将做到这一点。
/**
This is a convenience proc to uninstall a nop commerce plugin "dynamically"
This proc DROPs all foreign keys, and then all tables,
whose name contains the @YourPluginName param.
If naming conventions are followed,
there will be no side effects, but USE WITH CAUTION!
Please do a SELECT on sys.tables
with your Param before running this.
**/
CREATE PROC sp_UninstallPluginTables
(
@YourPluginName VARCHAR(250) /*This will typically be the nopcommerce plugin name */
)
/*----------------------------------FOREIGN KEYS---------------------------------------*/
declare CollectFkNames cursor for
SELECT 'ALTER TABLE ' + T.NAME + ' DROP CONSTRAINT ' + FK.NAME
FROM sys.foreign_keys FK
INNER JOIN sys.tables T ON T.object_id = FK.parent_object_id
WHERE FK.NAME LIKE @YourPluginName + '_%'
ORDER BY T.Name DESC
declare @DropForeignKeysCmd varchar(max)
open CollectFkNames
fetch next from CollectFkNames
into @DropForeignKeysCmd
while @@FETCH_STATUS=0
begin
exec(@DropForeignKeysCmd)
fetch next from CollectFkNames
into @DropForeignKeysCmd
end
close CollectFkNames
deallocate CollectFkNames
GO
/*-------------------------------------TABLES------------------------------------------*/
declare CollectTableNames cursor for
SELECT 'DROP TABLE ' + T.NAME
FROM sys.tables T
WHERE T.NAME LIKE @YourPluginName + '_%'
ORDER BY T.Name DESC
declare @DropTablesCmd varchar(max)
open CollectTableNames
fetch next from CollectTableNames
into @DropTablesCmd
while @@FETCH_STATUS=0
begin
exec(@DropTablesCmd)
fetch next from CollectTableNames
into @DropTablesCmd
end
close CollectTableNames
deallocate CollectTableNames
GO