我怎样才能动态地删除nopCommerce插件表?

时间:2016-01-25 17:26:01

标签: c# tsql plugins nopcommerce

  

我最近开发了一个相当大的插件,看到了很多变化   始终。不得不手动放下后我问自己这个问题   我忘了在Uninstall()方法中添加表格。

我正在构建一个nopCommerce插件,我想让我的PluginNameObjectContext.Uninstall()方法更灵活。

我关注Alex Wolf's tutorial *,目前看起来像是:

this.DropPluginTable("firstTable");
this.DropPluginTable("secondTable");
....
this.DropPluginTable("nthTable");

有很多地方需要在代码中反映对插件的数据访问层的更改。当我在插件域中添加或删除类时,我一直忘记更新此方法,这会导致错误,然后进行一些清理。

如何使这种方法更具动态性,并减轻整个开发过程中的维护负担?

*视频系列适用于Nop 3.5,因此在技术上仅落后于0.2版本,但如果您是nopCommerce开发的新手,则绝对无价。他的blog也有一些非常有用的帖子。

1 个答案:

答案 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