我有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();
这可行,但现在我有两个具有相同数据的集合。
答案 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>