Squeak.ru - шаблоны программирования

NHibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом

У меня есть класс со свойством

[Serializable]
public class MyClass    {



    public MyClass    ()
    {
    }




    public virtual System.DateTime Time        {
        get;
        set;
    }


    public virtual string Name        {
        get;
        set;
    }

    public virtual string Department        {
        get;
        set;
    }

    public virtual string Ip
    {
        get;
        set;
    }


    public virtual string Address        {
        get;
        set;
    }


    public override bool Equals(object obj)
    {

        if (obj == null)

            return false;

        MyClass    t = obj as MyClass    ;

        if (t == null)

            return false;

        if (this.Time  == t.Time  && this.Name== t.Name && this.Department== t.Department)

            return true;

        else

            return false;

    }

    public override int GetHashCode()
    {

        int hash = 13;

        hash = hash +

          (null == this.Time ? 0 : this.Time.GetHashCode());

        hash = hash +

          (null == this.Name? 0 : this.Name.GetHashCode());

        hash = hash +

        (null == this.Department ? 0 : this.Department.GetHashCode());

        return hash;

    }
}

У меня есть отображение Nhibernate как

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NhibernateTest" assembly="NhibernateTest">
    <class name="MyClass" table="NhibernateTest">
        <composite-id>
            <key-property column="Time" type="DateTime" name="Time"></key-property>
            <key-property name="Name" type="string" column="Name" ></key-property>
            <key-property name="Department" type="string" column="Department" ></key-property>
        </composite-id>
        <property column="Ip" type="string" name="Ip" />
        <property column="Address" type="string" name="Address" />
    </class>
</hibernate-mapping>

Я пытаюсь выполнить массовую загрузку для некоторых 40 тыс. данных с использованием составного ключа. используя следующий код.

    public void StoreInRDBMS(List<MyClass> FileList)
    {

       ITransaction transaction = null;
        try
        {     
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            ISession session = OpenSession();
            using (transaction = session.BeginTransaction())
            {

                foreach (var File in FileList)
                {

                    session.SaveOrUpdate(File);



                }

                session.Flush();
                session.Clear();
                transaction.Commit();

            }

            session.Close();


            stopwatch.Stop();

            var time = stopwatch.Elapsed;





        }
        catch (Exception ex)
        {

            transaction.Rollback();

        }
    }

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

{"другой объект с тем же значением идентификатора уже был связан с сеансом: NhibernateTest.MyClass, объекта: NhibernateTest.MyClass"}, хотя записи уникальны. а также, если это вообще не так, он должен обновить то же самое.

Он работает, если я очищаю сеанс после каждой итерации в цикле, например

                foreach (var File in FileList)
                {

                    session.SaveOrUpdate(File);

                    session.Flush();
                    session.Clear();


                }

что не должно иметь место, и даже его разговоры занимают 17 минут для 40 тыс. записей, если это делается вышеуказанным методом. Может ли кто-нибудь помочь относительно того же.


Ответы:


1

Может быть?

foreach (var File in FileList)
                {

                    session.SaveOrUpdate(File);
                    session.ExecuteUpdate();


                } 
26.05.2011
  • Привет, Олег, спасибо за ответ, но в сеансе Nhibernate нет такого метода, как Execute Update. более того, он будет выполнен после фиксации транзакции. 26.05.2011
  • @Pijush, о, извини, я снова все испортил. Это выглядит нормально, если не считать возможных проблем с памятью. Убедитесь, что у вас нет повторяющихся (с точки зрения вашего метода Equals()) записей в вашем FileList. 26.05.2011
  • @ Олег, у меня возникла проблема.. Когда я сбрасывал сессию каждый шаг в цикле. Запись шла одна за другой, другими словами, это не был пакетный процесс, но когда я использовал пакет, он не позволял дублировать запись в одном сеансе. Проблема с моим выбором составного ключа. Олег, спасибо за помощь :) 27.05.2011
  • Новые материалы

    Async Await в Swift: легкое управление параллелизмом
    Введение в запуск асинхронного кода Асинхронный код выполняет несколько операций одновременно. Параллелизм необходим при выполнении тяжелых вычислений или сетевых запросов. Однако это может..

    Очистить файлы Program .cache в Ubuntu 20.10
    Очистите кеш за несколько простых шагов! GNU / Linux реализовал эффективное управление хранилищем для своих пользователей. Но заметили ли вы, что в вашей системе Linux заканчивается место,..

    Использование Node.js для чтения действительно больших файлов (часть 1)
    В этом сообщении в блоге есть интересный источник вдохновения. На прошлой неделе кто-то на одном из моих каналов в Slack опубликовал тестовое задание, которое он получил на должность..

    Введение в градиентный спуск и обратное распространение
    Введение в градиентный спуск и обратное распространение Как машинное обучение? Машинное обучение ( ML ) - это исследование компьютерных алгоритмов, которые автоматически улучшаются по..

    Шаблон CQRS — C#
    Этот архитектурный шаблон в основном говорит о том, что мы можем использовать одну модель для операций чтения, а другую — для операций записи. Звучит хорошо, но реализовать его может быть..

    Освоение функций потерь в машинном обучении для регрессии: полное руководство по оптимизации…
    Введение: Функция потерь является важным компонентом алгоритмов машинного обучения и статистических моделей. Его роль заключается в измерении несоответствия между прогнозируемым выходом модели и..

    10 языков программирования, которые изменят мир в 2023 году
    Мир программирования постоянно развивается, и востребованные языки постоянно меняются. Однако есть несколько языков, которые выдержали испытание временем и по-прежнему очень ценны для изучения в..