Руководство Nhibernate с PK MySQL

У меня есть вопрос. Я использую NHibernate с MySql. В своих объектах я использую Id (PK) для использования в бизнес-логике и Guid (для репликации). Итак, мой базовый домен:

 public class BaseDomain
 {
    public virtual int Id { get; set; }
    public virtual Guid Guid { get; set; }
    public class Properties
    {
        public const string Id = "Id";
        public const string Guid = "Guid";
    }
    public BaseDomain() { }
 }

Мой домен использования:

public class ActivityCategory : BaseDomain
{
    public ActivityCategory() { }
    public virtual string Name { get; set; }
    public new class Properties
    {
        public const string Id = "Id";
        public const string Guid = "Guid";
        public const string Name = "Name";
        private Properties() { }
    }
}

Отображение:

 <class name="ActivityCategory, Clients.Core" table='Activity_category'>
   <id name="Id" unsaved-value="0" type="int">
      <column name="Id" not-null="true"/>
      <generator class="native"/>
   </id>
   <property name="Guid"/>
   <property name="Name"/>
 </class>

Но когда я вставляю свою сущность:

[Test]
    public void Test()
    {
        ActivityCategory ac = new ActivityCategory();
        ac.Name = "Test";
        using (var repo = new Repository<ActivityCategory>())
            repo.Save(ac);
    }

Я всегда получаю «00000000-0000-0000-0000-000000000000» в своем поле Guid. Что я должен сделать для создания правильного Guid. Может картирование?

Большое спасибо!


person Andrew Kalashnikov    schedule 11.03.2010    source источник


Ответы (1)


С точки зрения NHibernate вы должны либо установить guid на C#, либо сообщить NHibernate, что он создается базой данных.

В первом случае установите свойство guid в конструкторе.

public class BaseDomain
{
    public BaseDomain()
    {
        Guid = Guid.NewGuid();
    }
}

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

<class name="ActivityCategory, Clients.Core" table="Activity_category">
    <id name="Id" not-null="true" >
        <generator class="native" />
    </id>
    <property name="Guid" generated="insert" insert="false" update="false" />
    <property name="Name" />
</class>
person Lachlan Roche    schedule 11.03.2010
comment
Большое спасибо за ответ. Я хочу сгенерировать руководство по БД. Попробуйте ваш вариант сгенерировано = вставьте, но снова получите «00000000-0000-0000-0000-000000000000». Что я делаю неправильно? - person Andrew Kalashnikov; 11.03.2010
comment
Вероятно, вам нужно, чтобы этот столбец был нулевым или отсутствовал в операторе вставки. Я обновил ответ, чтобы исключить его из вставки. - person Lachlan Roche; 11.03.2010
comment
После этих изменений у меня есть: NHibernate: INSERT INTO client.Activity_category (Name) VALUES (?p0);?p0 = 'Test' activityca_.Id=?p0;?p0 = 4 NHibernate: UPDATE client.Activity_category SET Guid = ?p0, Name = ?p1 WHERE Id = ?p2;?p0 = 00000000-0000-0000-0000-000000000000, ?p1 = ' Тест', ?p2 = 4 - person Andrew Kalashnikov; 12.03.2010
comment
Это выглядит хорошо до обновления, вы можете увидеть SELECT для сгенерированного БД Guid. Вам не нужно указывать update=false, но я добавил и это. - person Lachlan Roche; 12.03.2010
comment
Большое спасибо за ваши ответы. Теперь у меня нет 00000000-0000-0000-0000-000000000000 в поле Guid, но есть нулевое значение. Что я должен сделать, чтобы MYSql сгенерировал мне руководство? - person Andrew Kalashnikov; 12.03.2010
comment
Может быть, mysql не имеет специального типа для guid и не может сгенерировать его через newuid()? Так что я могу сгенерировать его только из моего клиента? - person Andrew Kalashnikov; 12.03.2010
comment
Функция mysql — это UUID() dev.mysql.com. /doc/refman/5.1/ru/ - person Lachlan Roche; 12.03.2010
comment
Извините, это просто ошибка написания :( Могу ли я сгенерировать guid по базе данных с помощью NHibernate без sp? - person Andrew Kalashnikov; 12.03.2010