Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate SaveOrUpdate / 7 сообщений из 7, страница 1 из 1
03.03.2010, 11:05
    #36499109
Hug
Hug
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate SaveOrUpdate
Всем привет.
Хочу заставить работать SaveOrUpdate
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Pharm.Core"
                   namespace="Pharm.Core.Domain">
  <class name="PrepBrand, Pharm.Core" table='Prep_brand'>
    <id name="Id" unsaved-value="0" type="int">
      <column name="id" not-null="true"/>
      <generator class="native"/>
    </id>
    <property name="Name">
      <column name="Name" not-null="true" />
    </property>
  </class>
</hibernate-mapping>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
[Test]
public void TestRepo()
{
            var brand = new PrepBrand {Id = 41, Name = "Test"};
            var t = new List<DicDomain> {brand};
            using (var repo = new DicDomainRepository())
                repo.SaveAll(t);
}
public void SaveAll(List<DicDomain> dicDomains)
{
         using (ITransaction tx = NHibernateSession.BeginTransaction())
         {
                    foreach (DicDomain price in dicDomains)
                        NHibernateSession.SaveOrUpdate(price);
                    tx.Commit();
         }
 }
При существующем ID все происходит нормально - идет апдейт.
При несуществующем дб Инзерт, а идет опять апдейт. Все правильно - хибернейт не знает, что это новый объект. Как ему это сообщить?
http://devlicio.us/blogs/mike_nichols/archive/2008/07/29/when-flushing-goes-bad-assigned-ids-in-nhibernate.aspx
Шаманство с тегом version, который нигде толком не описан. Может кто сталкивался с версионированием?
...
Рейтинг: 0 / 0
03.03.2010, 11:25
    #36499173
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate SaveOrUpdate
Вроде как если хардкодно проставлять ID, то оно работать не будет. Нужен IDENTITY.
...
Рейтинг: 0 / 0
03.03.2010, 11:28
    #36499182
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate SaveOrUpdate
https://www.hibernate.org/hib_docs/nhibernate/html/manipulatingdata.html

Код: plaintext
1.
2.
<id name="Id" type="Int64" column="uid" unsaved-value="0">
    <generator class="hilo"/>
</id>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// in the first session
Cat cat = (Cat) firstSession.Load(typeof(Cat), catID);

// in a higher tier of the application
Cat mate = new Cat();
cat.Mate = mate;

// later, in a new session
secondSession.SaveOrUpdate(cat);   // update existing state (cat has a non-null id)
secondSession.SaveOrUpdate(mate);  // save the new instance (mate has a null id)
...
Рейтинг: 0 / 0
03.03.2010, 12:51
    #36499511
Hug
Hug
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate SaveOrUpdate
МСУ,

он с null id инзертит все ОК)
Я же хочу, что если не найдено - то вставь, если найдено то апдейт.
upsert

и тут либо вариант:
Get()? Insert(): Update()

Либо SP :( [скока подобного написано умотаться - хочется уходить]
...
Рейтинг: 0 / 0
03.03.2010, 13:02
    #36499546
Hug
Hug
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate SaveOrUpdate
Жаль, что ORM так обезличивает БД
У MySQL в арсенале есть мощные:

INSERT ... ON DUPLICATE KEY UPDATE
INSERT IGNORE

Есть быстрые вставки
Isert into(f1,f2..) values(v1,v2), (v3,v4)
Load In File

От меня всю эту пакетную обработку забирают, предлагая медленные методы.
Пусть дадут мне расширение, с которым я смогу взять все от бд(отказавшись от миграций), а не только ansi sql.
...
Рейтинг: 0 / 0
03.03.2010, 13:10
    #36499577
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate SaveOrUpdate
Что-то много слов...

HugGet()? Insert(): Update()
Так и делайте. В чём сложность-то?

P.S. А с SaveOrUpdate разберитесь и отпишитесь, тоже интересно.
...
Рейтинг: 0 / 0
13.03.2010, 19:52
    #36518510
Hug
Hug
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate SaveOrUpdate
Разобрался. С моим сценарием это не получится.
Надо id генерировать на клиенте и использовать версионное поле

PS МСУ, спасибо еще раз за ту тему. Увлекся Вашими постулатами. Начитался книг по DDD,TDD. Тперь мои *.Core.dll участвую во всех солюшнах, начиная от винформ, заканчивая цепочками wcf. Все везде работает, репозитории тестируются, hql пишется. Вообщем скил и культура кодинга поднялись на уровень. Перечитал классику [Гамму, Фаулера(арх), design patterns c#, нового Рихтера]. Выбил ЗП больше:D. Спасибо!!! Жду очередного архитектурного затыка, чтобы посовещаться с Вами
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate SaveOrUpdate / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]