Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > [NHibernate] KeyNotFoundException


Автор: kosmonaFFFt 13.8.2009, 17:46
Доброго времени суток...

При выполнении такого кода:
Код

var session = configuration.BuildSessionFactory().OpenSession();

вылазит экзепшн KeyNotFoundException
Начало это происходить при добавлении двух классов и маппингов к ним...
в сведениях выдает:
Код

System.Collections.Generic.KeyNotFoundException не обработано
  Message="Данный ключ отсутствует в словаре."
  Source="mscorlib"
  StackTrace:
       в System.ThrowHelper.ThrowKeyNotFoundException()
       в System.Collections.Generic.Dictionary`2.get_Item(TKey key)
       в NHibernate.Cfg.Configuration.Mapping.GetPersistentClass(String className)
       в NHibernate.Cfg.Configuration.Mapping.GetIdentifierType(String className)
       в NHibernate.Type.EntityType.GetIdentifierType(IMapping factory)
       в NHibernate.Type.EntityType.GetIdentifierOrUniqueKeyType(IMapping factory)
       в NHibernate.Persister.Entity.AbstractPropertyMapping.InitIdentifierPropertyPaths(String path, EntityType etype, String[] columns, IMapping factory)
       в NHibernate.Persister.Entity.AbstractPropertyMapping.InitPropertyPaths(String path, IType type, String[] columns, String[] formulaTemplates, IMapping factory)
       в NHibernate.Persister.Entity.AbstractEntityPersister.InitOrdinaryPropertyPaths(IMapping mapping)
       в NHibernate.Persister.Entity.AbstractEntityPersister.InitPropertyPaths(IMapping mapping)
       в NHibernate.Persister.Entity.AbstractEntityPersister.PostConstruct(IMapping mapping)
       в NHibernate.Persister.Entity.SingleTableEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping)
       в NHibernate.Persister.PersisterFactory.CreateClassPersister(PersistentClass model, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping cfg)
       в NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
       в NHibernate.Cfg.Configuration.BuildSessionFactory()
       в ReklamaProject.MainForm..ctor() в D:\proj\ReklamaProject\ReklamaProject\MainForm.cs:строка 25
       в ReklamaProject.Program.Main() в D:\proj\ReklamaProject\ReklamaProject\Program.cs:строка 17
       в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       в System.Threading.ThreadHelper.ThreadStart()
  InnerException:

Подскажите плс из за чего это может происходить и как с этим бороться?
Заранее спасибо...

Автор: SLeN 13.8.2009, 19:17
Код классов и маппинг в студию.

P.S.:

А что это там по русски то написано? Сам перевел или русская студия стоит (я видел пару баннеров про такую =) )?

Автор: kosmonaFFFt 14.8.2009, 07:28
Русская студия с DreamSpark + русский MSDN... smile
Код

using System;
using Iesi.Collections.Generic;

namespace ReklamaProject
{
    class Announcement
    {
        private Set<Number> numbers = new HashedSet<Number>();

        public virtual Int32 Id { get; set; }

        public virtual Rubric Rubric { get; set; }

        public virtual Subrubric Subrubric { get; set; }

        public virtual String Text { get; set; }

        public virtual String Telephon { get; set; }

        public virtual AnnouncementAdditionals Additionals { get; set; }

        public virtual Int32 GetWordsCount()
        {
            //TODO: сделать подсчет количества слов в тексте объявления.
            return 0;
        }

        public virtual Set<Number> Numbers
        {
            get
            {
                return this.numbers;
            }

            set
            {
                this.numbers = value;
            }
        }

        public virtual Boolean IsNal { get; set; }

        public virtual Manager Manager { get; set; }
    }
}


Код

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="ReklamaProject" assembly="ReklamaProject">
  <class name="Announcement">
    <id name="Id">
      <generator class="identity"/>
    </id>
    <one-to-one name="Rubric" class="Rubric"/>
    <one-to-one name="Subrubric" class="Subrubric"/>
    <property name="Text" not-null="true"/>
    <property name="Telephon" not-null="true"/>
    <one-to-one name="Additionals" class="AnnouncementAdditionals"/>
    <set name="Numbers" table="NumberAnnouncements">
      <key column="AnnouncementId"/>
      <many-to-many column="NumberId" class="Number"/>
    </set>
    <property name="IsNal" not-null="true"/>
    <one-to-one name="Manager" class="Manager"/>
  </class>
</hibernate-mapping>


Код

using System;
using Iesi.Collections.Generic;

namespace ReklamaProject
{
    class Number
    {
        private ISet<Announcement> anns = new HashedSet<Announcement>();

        public virtual Int32 Id { get; set; }

        public virtual Int32 Name { get; set; }

        public virtual ISet<Announcement> Announcements
        {
            get
            {
                return this.anns;
            }

            set
            {
                this.anns = value;
            }
        }
    }
}


Код

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="ReklamaProject" assembly="ReklamaProject">
  <class name="Number">
    <id name="Id">
      <generator class="identity"/>
    </id>
    <property name="Name" unique="true" not-null="true"/>
    <set name="Announcements" table="NumberAnnouncements">
      <key column="NumberId"/>
      <many-to-many column="AnnouncementId" class="Announcement"/>
    </set>
  </class>
</hibernate-mapping>


После добавления этих классов с маппингами вылезло исключение...

Автор: SLeN 14.8.2009, 11:38
Попробуй поменять Set<Number> в Announcement на ISet<Number> как в приватном поле так и в свойтсве


&  smile  уезжаю из города (по дальше от интернета и компьютеров) до среды, так что временно не участвую в дальнейшем обсуждении

Автор: kosmonaFFFt 23.8.2009, 12:52
Епрст... Точно... Спасиб, помогло...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)