重新定义现有映射

时间:2017-12-11 21:17:39

标签: c# sql-server nhibernate

我有Customer和Address表以及具有一对多关系的实体(客户有多个地址)。 我无法更改客户和地址实体。我需要向Customer和Address添加一个属性,所以我使用的是ExtendedCustomer和ExtendedAddress实体,在EntitiyType列上区分它们,并且它们都在SubclassMap中映射了ExtensionUID属性。我将这些列添加到SQL表中。

public class ExtendedCustomer :Customer
{
    public virtual string ExtensionUID  { get; set; }
}

public class ExtendedCustomerMap : CustomerMap
{
    public ExtendedCustomerMap ()
    {
        DiscriminateSubClassesOnColumn("EntityType", (byte)0).Not.Nullable();                                     
    }
}

public class ExtendedCustomerSubclassMap : SubclassMap<ExtendedCustomer>
{
    public ExtendedCustomerSubclassMap()
    {
        DiscriminatorValue(1);
        Map(x => x.ExtensionUID);            
    }
}

//Same stuff for Address/ExtendedAddress

以上所有这些都可以。

现在,问题在于Customer定义了属性IList<Address> Addresses。当我在调试器中查看ExtendedCustomer的实例时,Addresses包含ExtendedAddress的实例列表,但我无法访问代码中Addresses的ExtensionUID属性。

我可以以某种方式将Address属性重新定义为IList<ExtendedAddress> Addresses,以便我可以使用ExtensionUID属性吗?

我尝试添加new IList<ExtendedAddress> Addresses,但是nhibernate无法映射(无法转换...)。 我添加了IList<ExtendedAddress> ExtendedAddresses属性并定义了这样的映射:HasMany(x => x.ExtendedAddresses).KeyColumn("CustomerId").AsBag();这可行,但现在我有两个具有相同数据的集合。

1 个答案:

答案 0 :(得分:0)

我不确定,但我认为,您应该编辑您的地图文件。您可以与我们分享您的地图吗?

您的客户映射文件可以这样;

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="YourNameSpace" assembly="YourAssemblyName">

<class name="Customer" table="Customer">
<id name = "ID">
  <generator class = "native"/>
</id>

  <property name="Name"/>
<property name="SurName" />
<bag name ="Address"  lazy="true" cascade ="save-update" inverse ="false">
  <key column ="CustomerID"/>
  <one-to-many class ="Address"/>
</bag>

</class>

</hibernate-mapping>