2010-03-11 52 views
0

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

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。可能会映射?

非常感谢!

回答

1

从NHibernate的角度看,您应该设置一个GUID C#或告诉NHibernate的,它是由数据库生成的。

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

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

您映射属性whose value is generated in the database这样。根据如何生成值,您可能还需要从插入语句中排除该属性。

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

非常感谢您的回答。我想通过db生成guid。试试你的变体生成=“插入”,但再次获得'00000000-0000-0000-0000-000000000000'。我做错了什么? – 2010-03-11 10:54:17

+0

您可能需要该列在插入语句中为空或不存在。我已经更新了答案,将其从插入中排除。 – 2010-03-11 15:20:22

+0

这个变化之后,我已经有了: NHibernate的:INSERT INTO clients.Activity_category(名称)VALUES ;? P0 = '测试' NHibernate的(P0):SELECT LAST_INSERT_ID() NHibernate的:SELECT activityca_.Guid为Guid0_ FROM clients.Activity_category activityca_ WHERE activityca_.Id =?p0;?p0 = 4 NHibernate:UPDATE clients.Activity_category SET Guid =?p0,Name =?p1 WHERE Id =?p2;?p0 = 00000000-0000-0000-0000- 000000000000,?p1 ='Test',?p2 = 4 – 2010-03-12 06:32:30