суббота, 18 апреля 2009 г.

Designer - обновить InitializeComponent

Столкнулся с очередной "фишкой" дизайнера студии при работе с Windows Forms. Ситуация:
Вы разрабатываете CustomControl. У него много свойств. Вы его кидаете на форму, там все настраиваете и т.п. Затем вам нужно что-то поменять в CustomControl, расставить значения по-умолчанию, добавить/удалить свойства...
InitializeComponent в дизайнере не всегда успешно обновится в соответствии с вашими действиями. А уж если вы из него сами руками что-нибудь поудаляли - то проще контрол удалить с формы и добавить заново, чем исправить.
Так вот, этого делать не нужно. Чтобы Visual Studio обновила код дизайнера для вашего контрола, нужно довавить еще один такой же контрол на форму, затем сразу же удалить его - обновятся все свойства всех контролов с таким же типом (Magic).
P.S. Магия WinForms, магия дизайнера... открывая новые горизонты смысла... они меня убивают :)

воскресенье, 22 марта 2009 г.

TestDriven.NET, NHibernate and UnableToLoadProxyFactoryFactoryException

Пытаюсь запустить отдельный тест для проверки работы DAO.
[TestFixture]
public class CityTypeDaoFixture
{
private ISessionFactory _sessionFactory;
private Configuration _configuration;

[TestFixtureSetUp]
public void TestFixtureSetUp()
{
_configuration = new Configuration();
_configuration.Configure();
_configuration.AddAssembly(typeof(CityType).Assembly);
_sessionFactory = _configuration.BuildSessionFactory();
}

[SetUp]
public void SetupContext()
{
new SchemaExport(_configuration).Execute(false, true, false, false);
}

[Test]
public void CanAddNewCityType()
{
var product = new CityType { Name = "Большой город", MaxTrains = 16 };
ICityTypeDao cityTypeDao = new CityTypeDao();
cityTypeDao.Add(product);
}
}

При запуске теста получаю следующее:
TestCase 'RailSlewer.Tests.DALTests.CityTypeDaoFixture.CanAddNewCityType'
failed: TestFixtureSetUp failed in CityTypeDaoFixture
TestFixture failed: NHibernate.Bytecode.UnableToLoadProxyFactoryFactoryException : Unable to load type 'NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu' during configuration of proxy factory class.
Possible causes are:
- The NHibernate.Bytecode provider assembly was not deployed.
- The typeName used to initialize the 'proxyfactory.factory_class' property of the session-factory section is not well formed.

Solution:
Confirm that your deployment folder contains one of the following assemblies:
NHibernate.ByteCode.LinFu.dll
NHibernate.ByteCode.Castle.dll

При этом сборка NHibernate.ByteCode.LinFu.dll добавлена в References, у нее стоит CopyLocal=True и я сходил в Bin\Debug и убедился что она там лежит. 15 минут гугления и я выясняю, что не одинок. В интернете предлагают убедиться, что сборка лежит там же, где и бинари. Ну лежит. Не найдя решения в течении еще минут 15, применил метод научного тыка и со второй попытки нашел, где на самом деле ее хотят видеть:
"obj\Debug" - Вот где!

Update: Покопавшись с проблеммой еще, я выяснил что естественно из "obj\Debug" ничего грузиться не должно. Запустив свой проект при подключенных исходниках NHibernate (Тот же релиз NHibernate'a но не bin, а src) я прошел свой тест. Мучался я с этой проблеммой долго и нудно. Все нервы извел. В общем собрал самостоятельно NHibernate (ничего не менял) и теперь все тип-топ. Если кому интересно, то собранный мной из архива "NHibernate-2.1.0.Alpha1-src.zip" релиз можно скачать тут:
Только необходимые dll (581k) - все, что нужно чтобы NHibernate работал в вашем проекте
Все файлы релиза (3M) - все, что было во всех папках Bin\Release-2.0 после сборки релиза.

среда, 25 февраля 2009 г.

Visual Studio - Publish failed

Только что сталкнулся с мистической ошибкой - делаю build all для solution'a, содержащего web site - все отлично. Делаю publish веб сайту - ни одной ошибки компиляции, но... publish failed. Все перепробовал: сделал clean solution, clean project, reload project. Закрыл - открыл студию. Publish failed!!! Заработало только после того, как я в открытой студии сделал close solution и открыл его заново. Ппц... Как говорил один знакомый - при нынешнем уровне развития ПО оно скоро начнет проявлять признаки интеллекта и откажется работать на человека.

суббота, 21 февраля 2009 г.

Visual Studio - Add Existing Folder

Наверное многие сталкивались с тем, что в Visual Studio рядом с пунктом меню "Add existing file" нет меню "Add Existing Folder" и добавление нескольких файлов, лежащих в папке, которая находится в папке проекта, но не добавлена в проект превращается в настоящую пытку. А все по незнанию. Решение:
  1. Нажать кнопку "Show All Files"

  2. Теперь найти в Solution Explorer нужную папку (она будет белой)
  3. Нажать правой кнопкой и выбрать "Include in project"
Все! Очень просто :)

четверг, 18 октября 2007 г.

NDbUnit и MySQL

Ситуация: для тестирования в проекте используется NUnit + NDbUnit для тестирования работы с базой. Проект работал на MS SQL Server и все было прекрасно. Потом встала задача переделать все на MySQL, что и было сделано, но возникла проблема: NDbUnit с MySQL не дружит. Тоесть NDbUnit поддеживает только SQL Server и OLE DB базы. Ну казалось бы - OLE DB поддерживает, так и используем OLE DB provider для MySQL! Но не тут то было... Сначала встала проблемма, что официального провайдера нет. Нашел тот, что нашел: [sourceforge.net]. Но и с ним не заработало (кстати, позже нашел еще один: [cherrycitysoftware.com] Его не пробовал, он 10$ стоит, хотя и бесплатно можно использовать, но с морокой). Погуглил получше и нашел решение [forums.microsoft.com], хотя и не очень красивое:
  1. Идем в "Панель Управления" - "Администрирование" - "Источники данных (ODBC)". Там нужно добавить "Системный DSN" для MySQL базы к которой мы хотим приконнектиться, при этом в качестве драйвера выбираем MySQL ODBC 3.51 (можно скачать с оффициального сайта [dev.mysql.com]). В настройках драйвера выставляем все, что положено (кстати, сюда мы еще вернемся), DataSource Name я дал такое же, как у базы.
  2. Потом при создании Connection String в Visual Studio для Datasource выбираем ".Net Framework Data Provider for OLE DB"
  3. Для OLE DB Provider используем MSDataShape
  4. Для "Server or filename" используем DataSource Name, которое дали на шаге 2.
  5. Жмем "Test Connection" и радуемся.
Но не долго. Хотя MySQL через OLE DB мы к NDbUnit'у прикрутили, он все равно работает неправильно, т.к. внутри себя геренирует неправильные CRUD (Create Read Update Delete) SQL запросы. К счастью, NDbUnit OpenSource'ный, и как мне сказали "Если очень хочется, но нельзя - все возможно". Подсоединяем к проекту исходники NDbUnit.Core, ставим точку останова на той строке, в которой возникает ошибка в тесте (берем из NUnit'а). Ctrl+Alt+P и присоединяемся к процессу NUnit'a. Запускаем тест, попадаем в Visual Studio, по F11 идем вглубь NUnit'a и находим багу - откуда-то берется еще одна колонка с пустым ( "" ) именем, которая добавляется в запрос. С какой радости, мне выяснить не удалось - ставлю заплатку (проверяем, что имя колонки не является пустой строкой - точно ничего не испортит). Ура! Почти заработало: теперь вываливается на строке запроса к полю базы с именем "Version". Ну да - зарезервированное слово в MySQL. Надо писать так: `Version`. Ну, это решается совсем просто: ставим QuotePrefix и QuoteSuffix у OleDbCommandBuilder'a равными "`" . Казалось бы все. Не совсем: у нашей базы сложные связи друг сдругом, которые надо отключить на время тестов (для MS SQL использовалась недокументированная хранимая процедура "sp_msforeachtable" чтобы пройтись по всем таблицам и выполнить "ALTER TABLE ? NOCHECK CONSTRAINT all", для MySQL этот запрос не подходит). У MySQL же есть "SET FOREIGN_KEY_CHECKS = 0" но работает это только на session. А они открываются опять же где? Внутри NDbUnit'a! И до них не добраться. НО! Помните я в пункте 1) выше говорил что мы еще вернемся к настройкам драйвера? Там есть замечательное поле, навроде "set initial sql statement" (Точного названия не помню - нет под рукой). Вот туда и пишем "SET FOREIGN_KEY_CHECKS = 0". Теперь все нормально наконец-то.
Это решение хоть и работает, но вызывает у меня не лучшие эмоции - добавление источника данных ODBC, через десятые руки работа с базой, внесение изменений в исходники NDbUnit'a... Должен быть другой способ, которого я не нашел. Если кто знает - подскажите в какую сторону смотреть.