使用PK MySQL的Nhibernate Guid

时间:2010-03-11 09:49:17

标签: mysql nhibernate guid

我有一个问题。我使用NHibernate和MySql。在我的实体中,我使用Id(PK)作为业务逻辑用法和Guid(用于复制)。所以我的BaseDomain:

 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);
    }

我的Guid字段总是得到'00000000-0000-0000-0000-000000000000'。 我应该怎么做才能生成正确的Guid。可能是映射?

非常感谢!

1 个答案:

答案 0 :(得分:1)

从NHibernate的角度来看,你应该在C#中设置guid,或者告诉NHibernate它是由数据库生成的。

在前一种情况下,在构造函数中设置guid属性。

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

您可以像这样映射属性whose value is generated in the database。根据值的生成方式,您可能还需要从insert语句中排除该属性。

<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>