NHibernate中的映射问题

时间:2009-03-06 18:53:13

标签: c# .net nhibernate orm mapping

我有以下课程:

public class Customer
{
    public virtual int CustomerID { get; protected set; }
    public virtual string AccountNumber { get; protected set; }
    public virtual string CustomerType { get; set; }
    public virtual int TerritoryID { get; set; }
    public virtual SalesTerritory Territory { get; protected set; }
}

使用Fluent NHibernate进行映射如下:

    public class CustomerMapper : ClassMap<Customer>
{
    private const string schema = "Sales";
    public CustomerMapper()
    {
        SchemaIs(schema);
        Id(x => x.CustomerID);
        Map(x => x.CustomerType).WithLengthOf(1).Not.Nullable();
        Map(x => x.TerritoryID).Not.Nullable();

        Map(x => x.AccountNumber).ReadOnly()
            .Update(false)
            .Insert(false)
            .Generated(Generated.Insert);

        References<SalesTerritory>(x => x.Territory).TheColumnNameIs(ReflectionHelper.GetProperty<Customer>(x => x.TerritoryID).Name).LazyLoad().Update(false).Insert(false);
    }
}

更新和插入方法只是设置属性的 更新 插入 属性的扩展方法在生成的映射文件中。

这是生成的映射文件的外观:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" assembly="Model" namespace="Model" schema="Sales">
    <class name="Customer" table="`Customer`" xmlns="urn:nhibernate-mapping-2.2">
        <id name="CustomerID" column="CustomerID" type="Int32">
            <generator class="identity" />
        </id>
        <property name="AccountNumber" column="AccountNumber" insert="false" update="false" generated="insert" length="100" type="String">
            <column name="AccountNumber" />
        </property>
        <property name="TerritoryID" column="TerritoryID" not-null="true" type="Int32">
            <column name="TerritoryID" />
        </property>
        <property name="CustomerType" column="CustomerType" not-null="true" length="1" type="String">
            <column name="CustomerType" />
        </property>
        <many-to-one lazy="proxy" update="false" insert="false" name="Territory" column="TerritoryID" />
    </class>
</hibernate-mapping>

我的问题是,当将新客户实例保存到数据库中时,客户实例的Territory属性为null。
保存到数据库后,如何使此属性包含正确的值? 我正在查看类似 生成的 属性的内容,这些属性会在刷新会话后检索正确的值。
或者我的Customer类有什么问题吗?
提前谢谢。

编辑1:我用于此模型的数据库是AdventureWorks(SQL2005),表Sales.Customer和Sales.SalesTerritory。

2 个答案:

答案 0 :(得分:2)

更明智的映射就像:

public class CustomerMapper : ClassMap<Customer>
{
    private const string schema = "Sales";
    public CustomerMapper()
    {
        SchemaIs(schema);
        Id(x => x.CustomerID);
        Map(x => x.CustomerType).WithLengthOf(1).Not.Nullable();
        Map(x => x.AccountNumber).ReadOnly()
           .Generated(Generated.Insert);
        References(x => x.Territory).LazyLoad();
    }
}

有些观点:

  • 这是一个映射的SalesTerritory类。
  • 不需要TerritoryID。
  • 如果使用Insert(false)和Update(false),则这些属性将不会保存到数据库中。 ReadOnly()同时执行Insert(false)和Update(false)。
  • CostumerType完全可以成为枚举。

这或多或少都是这个想法(航空代码)。

答案 1 :(得分:0)

我认为你的映射很奇怪...... territoryId属性与Territory属性的关系是什么? 在映射Territory属性的多对一映射中,您是否必须指定Territory的类型? (SalesTerritory)。 您将2个属性映射到同一列,为什么?