вторник, 29 апреля 2014 г.

Entity Framework и транзакции

При использовании баз данных в проектах чуть более сложных, нежели простенький сайт на пару страниц, рано или поздно встает проблема использования транзакций. Если же вы решили использовать Entity Framework, то, до выхода EF6 стандартного механизма управления транзакциями в Entity Framework не существовало.  Теперь же, у свойства контекста Database появился метод BeginTransaction(). Используется от вот так.

using (var context = new YourDBContext())
{
   using (var tran = context.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
   {
     try 
     {
           /..../
           tran.Commit();
     }     
     catch
     {
           tran.Rollback();
     }        
   }
}

Есть вариант BeginTransaction() и без явного указания уровня изоляции, при использовании которого используется уровень изоляции по умолчанию для источника данных. Соответственно, все что находится в блоке using включается в транзакцию. Причем, включаться то оно, включается, но вот откатывать или коммитить транзакцию - это ваша обязанность. Автоматически при выходе из using ничего не происходит.

Ну а если вы используете предыдущие версии Entity Framework, то можно использовать делать так: подключаете сборку System.Transactions и используете класс TransactionScope.

using (var scope = new TransactionScope(TransactionScopeOptions.Requires, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
   {
      try
      {
          /..../
          scope.Complete();
      }
      catch
      {

      }
   }


В этом случае, при выходе из using транзакция автоматически откатывается. И, кстати, TransactionScope поддерживает распределенные транзакции, для чего, правда, нужно настраивать на всех машинах где исполняется код или находятся базы данных Distributed Transaction Coordinator.


Поиск по Lookup полям с помощью CAML

Lookup поля в SharePoint представляются своего рода структуру, содержащую два свойства LookupId и LookupValue, которые, когда вы делаете .ToString() отображаются как {LookupId;#LookupValue}, то есть, если у вас в списке контактов есть поле ссылающееся на список отделов, то оно может выглядеть так: {1;#IT}. И то что при отображении этого поля его истинная структура скрывается, особенно, если вы недавно начали использовать CAML, вполне может запутать, в результате чего вы напишете что-то типа:

                        
               SPQuery query = new SPQuery
               {
                   Query = @"
                                
                                   
                                   12345
                                
                             "
               };
               SPListItemCollection items = itemsList.GetItems(query);

И, кстати, если вы хотите искать по значению (то есть, по текстовой составляющей), то это сработает. А если вы ищите по ID, то этот поиск не даст никаких результатов. Для поиска Lookup-полях по ID нужно немного изменить запрос. Вот так:

 
                SPQuery query = new SPQuery
                {
                    Query = @"
                                
                                   
                                   12345
                                
                             "
                };
                SPListItemCollection items = itemsList.GetItems(query); 


понедельник, 28 апреля 2014 г.

Как победить невозможность соединения с локальным SharePoint 2013 из Visual Studio

Как вам наверное известно, в SharePoint 2013 убрали возможность установки на клиентские операционные системы (Windows 7), так что теперь остается два варианта для рабочего места разработчика - установка Windows Server 2008 или работа в терминальном режиме. Но это так, предыстория. 


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

The local SharePoint server is not available. Check that the server is running and connected to the SharePoint farm.

или такую:

Cannot connect to the SharePoint site: http://yoursite. Make sure that the Site URL is valid, that the SharePoint site is running on the local computer, and that the current user as the necessary permissions to access the site.

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




воскресенье, 27 апреля 2014 г.

Про не очевидные ошибки в Team Foundation Server

В Team Foundation Server иногда возникают ошибки, причину которых понять не так и просто. Расскажу вам про две из них возникающие при настройке автоматических сборок, и понять как с бороться с которыми обычно не так просто.

Первая ошибка появляется всегда, если не сервере, где установлен TFS не установлена Visual Studio. Текст ошибки примерно такой:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets (983): The reference assemblies for framework ".NETFramework,Version=v4.5" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.

И не смотря на то, что вначале кажется, что почему-то не установился .Net Framework, дело совсем не этом. Просто скопируйте с машины на которой установлена Visual Studio папки с библиотеками, относящимися к определенной версии .Net. Например, для .Net 4.5 это:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5

Со второй ошибкой вы можете столкнуться, если ваш проект ссылается на какие-то нестандартные библиотеки. Текст ошибки примерно такой:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets (1360): Could not resolve this reference. Could not locate the assembly "Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.

Лечится ошибка просто - нужно в конфигурации MSBuild для того билда на котором происходит эта ошибка добавить ссылку на директорию с дополнительными библиотеками. Делается это добавлением вот такого ключа:

/p:ReferencePath="C:\MyDLLs\"

 И сложить библиотеки в эту папку.