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

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

[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 Ответ

0 голосов
/ 26 мая 2011

Может быть?

foreach (var File in FileList)
                {

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


                } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...