C# AR помогите кто знает :)

HraKK

Мудак
Команда форума
Начал сейчас потихоньку изучать C# и никак не могу понять, как тут можно сделать простой AR.

Допустим есть таблица users
login: varchar(32)
password: varchar(32)
createTime: timestamp

есть struct User
{
public string login;
public string password;
public int createTime;
}

как мне выбрать все из базы данных и замаппить в эту структуру? Использую Ngpsql адаптер(но не принципиально).

Спасибо.
 

Adelf

Administrator
Команда форума
Ну в NHibernate, который я юзаю, делается както так:
PHP:
using(session = sessionFactory.OpenSession())
{
  var users = session.CreateCriteria<User>().List<User>(); // вполне можно сделать extension метод, позволяющий сократить код до одного вызова.
  ...
}
Правда все-таки Map-класс надо там сделать и зарегить, при использовании FluentNHibernate(советую). Или xml-mapping без него.
 

HraKK

Мудак
Команда форума
Если не сложно, можно какой-то код с простой базой как у меня, с простейшими операциями - выбрать все, выбрать по критерии, обновить createTime и сохранить в базу. А то я часами перебираю разные фреймворки и смотрю как и что, а наглядно будет все понятно за пару минут.

Спасибо.
 

HraKK

Мудак
Команда форума
Еще, смотрю на EF, если б еще на нем пример)
 

Adelf

Administrator
Команда форума
Да несложно. Я когда выбирал фреймворк смотрел тяжеловесов(EF и NHibernate). Ибо логики много. Legacy база.. и СУБД которую никто почти не знает(SqlBase). И на основе последнего параметра выбрал разработанный "коммунити" NHibernate, ибо микрософтовский Entity фреймворк думал не настрою под такую древнюю СУБД. Вообще - не ошибся. Сумел на основе ораклового драйвера довольно быстро(полдня) написать свой и все заработало.
Про NHibernate могу сказать, что он не любит Legacy базы. Но если есть такая, то крайне желательно не иметь составных примарных ключей. Поддерживает их, но не любит.
Операции...

PHP:
using(var session = sessionFactory.OpenSession())
{
  using(var transaction = session.BeginTransaction()) // Мы апдейтить собрались, поэтому транзакцию открываем
  {
    var user = session.Get<User>(login);
    if(user == null) return;

    user.SetPassword(newPassword); // думаю все хеширования, если нужно, делать именно там ;-)
    session.Update(user);

    transaction.Commit();
  }
}
PHP:
using(var session = sessionFactory.OpenSession())
{
  using(var transaction = session.BeginTransaction())
  {
    var adminUsers = session.CreateCriteria<User>()
      .Add(Restrictions.Eq("Category", category))
      .List<User>();
    foreach(var user in adminUsers)
    {
      session.Delete(user); // гг :)
    }

    transaction.Commit();
  }
}
Для сложных критериев можно использовать, похожий на SQL, язык HQL... изредка использую. Да и напрямую SQL можно.

EF хорош тем, что не нужно прописывать маппинг в отдельном классе(или xml файле), а используются атрибуты. Мне тоже кажется приятным такой вариант. Но кто-то мне говорил, что там проблемы с lazy-loading. В общем я лично его не смотрел подробно, поэтому лучше промолчу :)
 

Adelf

Administrator
Команда форума
fixxxer
в методе Dispose(интерфейс IDisposable - using может применяться только для классов, поддерживающих этот интерфейс). Это типа managed деструктор.
 
Сверху