如何动态删除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开发的新手,它绝对是无价的。他的博客也有一些非常有用的帖子。

如何动态删除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