2010-11-15 67 views
1

我有以下实体:字典不会与NHibernate坚持3.0

public class Alert 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IDictionary<CxChannel, string> Messages { get; set; } 
} 

public enum CxChannel 
{ 
    Message, 
    Email 
} 

及以下映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Entities.Alert, Entities" table="alert"> 
    <id name="Id" type="int" unsaved-value="0" access="property"> 
    <generator class="identity"/> 
    </id> 

    <property name="Name" column="name"/> 
    <map name="Messages" table="alert_message" cascade="all"> 
     <key column="alert_id"/> 
     <index column="channel" type="Entities.CxChannel, Entities"/> 
     <element column="message" type="System.String"/> 
    </map> 
    </class> 
</hibernate-mapping> 

的问题是,当我保存警报实体,消息字典不是坚持数据库。事实上,我的代码看起来像Oren在他的博客文章中使用的代码:http://ayende.com/Blog/archive/2009/06/03/nhibernate-mapping-ndash-ltmapgt.aspx

有没有人遇到过相同的问题?

+0

您是否正在进行交易? – 2010-11-16 00:16:27

+0

是的迭戈。此外,警报表中填充了其数据。 – 2010-11-16 15:09:06

回答

1

验证您的通道列是模式中的整数,因为CxChannel枚举将映射为0(对于消息)和1(对于电子邮件)。我只是将代码和映射粘贴到控制台项目中,使用新的SchemaExport(cfg).Execute(false,true,false),并成功将行插入到生成的数据库中。

+0

谢谢詹姆斯。通道列在我的模式中是一个整数。有趣的是,你可以得到它的工作。我会用你的方法,看看我能找到什么。 – 2010-11-16 15:04:57

+0

我不知道你的模式是否有些奇怪。我会将SchemaExport转换为干净的数据库,然后使用DataDude或RedGate SQL Compare等工具来区分生成的模式和模式。 (顺便说一句 - 我使用的是NH3 build 3.0.0.2001。不应该有所作为,但以防万一......) – 2010-11-16 15:45:42

+0

我尝试了与你解释的相同的方式,并且NHibernate没有在alert_message中插入数据。您是否查询过您是否收到了插入到消息中的相同数据?我为NHibernate设置了show_sql = true,对地图设置了lazy = false,并注意到NHinbernate仅为alert生成INSERT。但是当我尝试加载数据时,它也从alert_message中检索。 – 2010-11-16 22:06:30