如何动态删除nopCommerce插件表
本文关键字:删除 nopCommerce 插件 动态 何动态 | 更新日期: 2023-09-27 18:31:52
我最近开发了一个相当大的插件,它看到了很多变化 整个。在不得不手动放弃后,我问自己这个问题 我忘了包含在
Uninstall()
方法中的表。
我正在构建一个nopCommerce插件,我想让我的PluginNameObjectContext.Uninstall()
方法更加灵活。
我遵循了 Alex Wolf 的教程*,目前看起来像:
this.DropPluginTable("firstTable");
this.DropPluginTable("secondTable");
....
this.DropPluginTable("nthTable");
在很多地方,对插件数据访问层的更改需要反映在代码中。当我在插件的域中添加或删除类时,我一直忘记更新此方法,这会导致错误,然后进行一些清理。
如何使此方法更具动态性,并减轻整个开发过程中的维护负担?
*该视频系列适用于Nop 3.5,因此在技术上比当前版本落后0.2版本,但如果您是nopCommerce开发的新手,它绝对是无价的。他的博客也有一些非常有用的帖子。
由于 MVC 和 NopCommerce 倡导的Convention over Configuration
原则,我们可以利用一致的命名。
配置数据访问时遵循命名约定,特别是EntityTypeConfiguration<T Entity>
映射类。将所有ToTable()
方法设置为以插件名称开头,如下所示:
ToTable("PluginName_InterestingStuff");
HasKey(k => k.Id);
Property(p => p.Puppies);
...
这样,ObjectContext
类中的Install()
方法将生成以插件名称开头的 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