2016-01-25 2 views
1

Недавно я разработал довольно большой плагин, который видел много изменений повсюду. Я задал себе этот вопрос после того, как вручную сбросил таблицы . Я забыл включить в метод .Как я могу DROP плагины nopCommerce динамически?

Я создаю плагин nopCommerce, и я хочу сделать мой метод PluginNameObjectContext.Uninstall() более гибким.

Я последовал Alex Wolf's tutorial *, и она в настоящее время выглядит следующим образом:

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

Есть много мест, которые должны быть отражены в коде изменение уровня доступа к данным плагина. Я не забываю обновлять этот метод, когда добавляю или удаляю классы в домене плагина, что приводит к ошибкам, а затем к некоторой очистке.

Как я могу сделать этот метод более динамичным и снизить нагрузку на техническое обслуживание на протяжении всего бремени развития?


* видеоряд для Nop 3.5, так что технически 0.2 версии за текущий, но абсолютно бесценным, если вы новичок в разработке nopCommerce. Его содержит очень полезные сообщения.

ответ

0

Благодаря принципу Convention over Configuration, защищенному MVC и NopCommerce, мы можем использовать последовательное именование.

Придерживайтесь соглашений об именах при настройке доступа к данным, в частности, ваших классов сопоставления EntityTypeConfiguration<T Entity>. Установить все ваши ToTable() метод, чтобы начать с вашим именем плагина следующим образом:

ToTable("PluginName_InterestingStuff"); 

HasKey(k => k.Id); 
Property(p => p.Puppies); 
... 

Таким образом, метод Install() в ObjectContext классе будет генерировать таблицы SQL, начиная с именем плагина:

dbo.PluginName_Foo 
dbo.PluginName_Bar 

If вы правильно настроили свои классы кода, у вас, вероятно, будут какие-то внешние ключи. По дизайну они также будут следовать соглашению об именах, и их имена начнутся с вашего имени плагина.

Используйте это, создав хранимую процедуру в базе данных приложений, в которой будут удалены все внешние ключи и таблицы, содержащие @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