Nhibernate映射值对象,引用为属性

时间:2014-06-05 06:53:59

标签: c# .net hibernate nhibernate nhibernate-mapping

我有以下实体 CountryStateCity

我还有User实体。

CountryStateCity与用户实体没有关系。 UserCountryStateCity没有直接关系。

我希望能够以这种方式更新用户地址详细信息 用户将选择国家,州和城市并保存此值。 我正在考虑引入将存储此用户地址信息的Address值对象。

这是个好主意吗?你会如何处理这种情况?

我使用nhibernate orm并使用Conformist进行映射(通过代码方法进行映射) 所以我在考虑将Address映射为值对象

Component(c => c.Address, AddressMap.Mapping());

public class AddressMap
    {
        public static Action<IComponentMapper<Address>> Mapping()
        {
            return c =>
            {
                c.Property(p => p.Country);
                c.Property(p => p.State);                    
                c.Property(p => p.City);
            };
        }
    }

UserMap

中有这个
Component(c => c.Address, AddressMap.Mapping());

我收到了以下错误

  

NHibernate.SessionProvider&#39;的类型初始值设定项。扔了一个   例外。 {&#34;无法确定类型:Model.Country,...,for   columns:NHibernate.Mapping.Column(Country)&#34;}

Component(c => c.Address, AddressMap.Mapping());中没有此行UserMap我没有任何错误(我也没有映射地址值对象:)。

1 个答案:

答案 0 :(得分:2)

我想说,这个问题来自于Country不是值类型(包括字符串),而是一个参考。如果是这种情况,我们不能将其映射为c.Property(),而是作为参考:

c.ManyToOne(p => p.Country, "CountryId"); // reference

c.Property(p => p.State);                 // value types represented 
c.Property(p => p.City);                  // by values in columns

有关详细信息,请参阅:Mapping-by-Code - ManyToOne

ManyToOne(x => x.PropertyName, m =>
{
    m.Column("column_name");
    // or...
    m.Column(c =>
    {
        c.Name("column_name");
        // other standard column options
    });
    ...
    // many more