Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 NHibernate: создание кастомного генератора id  [new]
Rodya
Member

Откуда:
Сообщений: 10
Вопрос к людям, пользующимся хибернатом.

Есть сборка PersistentData. И есть класс UUIDGenerator:
namespace PersistentData
{
    public class UUIDGenerator : IIdentifierGenerator
    {
        ... 

        public object Generate(ISessionImplementor session, object obj)
        {
            ...
            return ...;
        }
    }
}

Хочу использовать этот класс в качестве кастомного генератора уидов:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="PersistentData" namespace="PersistentData">
  <class name="IPersistentObject" table="TBL_PERSISTENT_OBJECTS" abstract="true" >
    <id name="uuid">
      <column name="UUID"/>
      <generator class="PersistentData.UUIDGenerator"/>
    </id>
  </class>
</hibernate-mapping>

Однако, BuildSessionFactory() выкидавет исключение:
автор
Could not interpret id generator strategy: PersistentData.UUIDGenerator. Possible cause: no assembly name specified.


Народ, где я туплю?
25 янв 10, 12:31    [8239749]     Ответить | Цитировать Сообщить модератору
 Re: NHibernate: создание кастомного генератора id  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="PersistentData" namespace="PersistentData">
  <class name="IPersistentObject" table="TBL_PERSISTENT_OBJECTS" abstract="true" >
    <id name="uuid">
      <column name="UUID"/>
      <generator class="PersistentData.UUIDGenerator, PersistentData"/>
    </id>
  </class>
</hibernate-mapping>

P.S. Возможны коллизии при одинаковых assembly name и namespace, проверьте.
25 янв 10, 13:51    [8240522]     Ответить | Цитировать Сообщить модератору
 Re: NHibernate: создание кастомного генератора id  [new]
Rodya
Member

Откуда:
Сообщений: 10
Сделал. Проблема осталась. Даже сообщение об ошибке то же.

Дальше в маппинге меняю на <generator class="UUIDGenerator, PersistentData"/>
Ошибка: System.TypeLoadException: Could not load type 'UUIDGenerator' from assembly 'PersistentData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Меняю namespace на PersistentData.Generator. Т.е.:
namespace PersistentData.Generator
{
    public class UUIDGenerator : IIdentifierGenerator
    {
        public object Generate(ISessionImplementor session, object obj)
        {
            return Guid.NewGuid();
        }
    }
}

В маппинге пишу:
<generator class="PersistentData.Generator.UUIDGenerator, PersistentData"/>

Получаю ошибку:
Could not load type PersistentData.UUIDGenerator. Possible cause: no assembly name specified.
Дважды проверил, что все перебилдилось, а загрузить он все равно пытается PersistentData.UUIDGenerator, а не PersistentData.Generator.UUIDGenerator.

Хрен с ним. В маппинге пишу
<generator class="Generator.UUIDGenerator, PersistentData"/>

Получаю:
System.TypeLoadException: Could not load type 'UUIDGenerator' from assembly 'PersistentData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Также переносил класс генератора в другую сборку. Там игрался с неймспейсами. Нифига не помогает.

МСУ
P.S. Возможны коллизии при одинаковых assembly name и namespace, проверьте.


Может быть так и есть, но даже при изменении неймспейса ниче не помогает.
Понятно, что это я туплю жеско, но где? Ткните носом...
25 янв 10, 22:07    [8243599]     Ответить | Цитировать Сообщить модератору
 Re: NHibernate: создание кастомного генератора id  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Я не помню, то ли PersistentData, то ли UUIDGenerator - зарезервированное имя, когда-то обсуждалось на каком-то форуме по хибу. Меняйте неймспейс и название генератора.

Вот тестовый пример, он прекрасно работает:

+ sample

CREATE TABLE [dbo].[BOOKS](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[ISBN] [nvarchar](255) NULL,
	[TITLE] [nvarchar](255) NULL,
 CONSTRAINT [PK_BOOKS] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


public class Book
{
    public class Properties
    {
        public const string Book = "Book";
        public const string ID = "ID";
        public const string ISBN = "ISBN";
        public const string TITLE = "TITLE";

        private Properties() { }
    }

    public Book()
    {
    }

    public Book(string isbn, string title)
    {
        ISBN = isbn;
        TITLE = title;
    }

    public virtual int ID { get; set; }
    public virtual string ISBN { get; set; }
    public virtual string TITLE { get; set; }
}

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MySpace" assembly="MySpace">
	<class name="Book" table="BOOKS">
		<id name="ID">
			<column name="ID" />
			<generator class="MySpace.MyGenerator, MySpace" />
		</id>
		<property name="ISBN" />
		<property name="TITLE" />
	</class>
</hibernate-mapping>

public class MyGenerator : IIdentifierGenerator 
{
    public object Generate(ISessionImplementor session, object obj)
    {
        return 3;
    }
}
26 янв 10, 01:02    [8243958]     Ответить | Цитировать Сообщить модератору
 Re: NHibernate: создание кастомного генератора id  [new]
Rodya
Member

Откуда:
Сообщений: 10
МСУ
то ли PersistentData, то ли UUIDGenerator - зарезервированное имя


СПАСИБО!!!
Действительно поменял имя неймспейса, сборки и класса и все заработало.
26 янв 10, 07:10    [8244206]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить