Дозвуковая ошибка VS2008 T4 в БД с множеством таблиц System.Runtime.Remoting.RemotingException - PullRequest
1 голос
/ 19 февраля 2010

В консультационном задании они используют Subsonic 3.x (последняя версия), которая использует механизм шаблонов кода T4 (а не CodeSmith, как в 2.x)

Когда мы запускаем ее в нашей СУБД, содержащей ~ 1 000 таблиц, мы сталкиваемся с ошибкой, генерирующей файл Structs.cs. T4 / Subsonic генерирует нормально на небольших БД ....

Исключительная ситуация при выполнении кода преобразования. Процесс не может продолжаться. Было выдано следующее исключение:

System.Runtime.Remoting.RemotingException: Object '/F9ce56f8_409c_4465_b81c_5272c8d764dc/dbet1oh1u2djvp2ildubn9nb_25.rem' был отключен или не существует на сервере. в Microsoft.VisualStudio.TextTemplating.TransformationRunner.get_Errors () в Microsoft.VisualStudio.TextTemplating.Engine.CompileAndRunCode (String generatorCode, ITextTemplatingEngineHost host, TemplateProcessingSession session) C: \ Users \ BlahBlahUserName \ Documents \ Visual Studio 2008 \ EdsTry \ EdSub \ ActiveRecord \ Structs.tt

Это приводит к двум вопросам

  1. кто-нибудь видел это и знает какие-либо обходные пути, когда T4 взрывается на большие файлы?

  2. И как только я решу это, я могу изменить дозвуковой, чтобы он генерировал меньше файлы (скажем, 1000 файлов классов, а не 1 большой файл класса)

Vstudio захлебывается большими файлами классов, которые он генерирует, если мы включаем жесткость создания Subsonic в наш основной проект, поэтому мы делаем это в отдельном проекте и ссылаемся на полученную DLL, но, безусловно, должен быть способ генерировать несколько сотен файлов классов из дозвуковых против 1 файл с несколькими сотнями классов в нем.

Ответы [ 3 ]

0 голосов
/ 16 июня 2010

У меня была такая же проблема, и я обнаружил, что эта ошибка вызвана из-за тайм-аута соединения.

Вот как я подключаюсь к базе данных для получения всех сущностей / представлений / процедур / и т. Д.1004 *

Ключевым моментом является установка этих двух аргументов:

conn.ConnectTimeout = 0;
conn.StatementTimeout = 0;

После установки этих параметров мой генератор работает хорошо.

Надеюсь, он будет работать для вас.

0 голосов
/ 16 ноября 2010

Если вашему программному обеспечению не требуются все 1000 таблиц, вы можете превратить черный список «ExcludeTables» в белый список «IncludeTables» и найти / заменить все «! ExcludeTables» на «IncludeTables» в файлах * .tt. Кроме того, я изменил LoadTables () в SQLServer.ttinclude, чтобы проверить мой белый список, прежде чем он сделает какие-либо другие вызовы, и добавил таблицу:

while(rdr.Read()){
            Table tbl=new Table();
            tbl.Name=rdr["TABLE_NAME"].ToString();
            // check table whitelist
            if (IncludeTables.Contains(tbl.Name)
   {
    tbl.Schema=rdr["TABLE_SCHEMA"].ToString();
    tbl.Columns=LoadColumns(tbl);
    tbl.PrimaryKey=GetPK(tbl.Name);
    tbl.CleanName=CleanUp(tbl.Name);
    tbl.ClassName=Inflector.MakeSingular(tbl.CleanName);
    tbl.QueryableName=Inflector.MakePlural(tbl.ClassName);

    //set the PK for the columns
    var pkColumn=tbl.Columns.SingleOrDefault(x=>x.Name.ToLower().Trim()==tbl.PrimaryKey.ToLower().Trim());
    if(pkColumn!=null)
     pkColumn.IsPK=true;

    tbl.FKTables=LoadFKTables(tbl.Name);
    result.Add(tbl);
   }
        }

Я сделал то же самое для GetSPs хранимых процедур в SQLServer.ttinclude:

// Check SP whitelist too
if(spType=="PROCEDURE" && IncludeSPs.Contains(sp.Name) &! sp.Name.StartsWith("sp_")){

         sp.CleanName=CleanUp(sp.Name);

            sp.Parameters=GetSPParams(sp.Name);
            result.Add(sp);        
        }

Теперь все * .tt выполняются без исключения Remoting.

0 голосов
/ 25 февраля 2010

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

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

но если ваша база данных настолько массивна, что у вас более 1000 таблиц, я думаю, вам лучше начать с проектирования БД и, возможно, разбить таблицы на группы баз данных и иметь несколько dals, т.е. люди БД и т. д. таким образом, вы будете держать его маленьким и все равно сможет использовать их все, если это имеет смысл

...