C# 类设计与NHibernate映射问题
我有一个地址类,我想用于其他对象的地址信息。下面我粘贴了两个使用Address类的示例类Company和PersonC# 类设计与NHibernate映射问题,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我有一个地址类,我想用于其他对象的地址信息。下面我粘贴了两个使用Address类的示例类Company和Person public class Company { public virtual string Name { get; set; } public virtual string Phone { get; set; } public virtual string Fax { get; set; } public virtual Address Addre
public class Company
{
public virtual string Name { get; set; }
public virtual string Phone { get; set; }
public virtual string Fax { get; set; }
public virtual Address Address { get; set; }
}
public class Person
{
public virtual string Name { get; set; }
public virtual string Phone { get; set; }
public virtual string Fax { get; set; }
public virtual Address Address { get; set; }
}
public class Address
{
public virtual string Address1 { get; set; }
public virtual string CityName { get; set; }
public virtual string StateName { get; set; }
public virtual string CountryName { get; set; }
public virtual AddressOf AddressOf { get; set; }
public virtual object Owner { get; set; }
}
public enum AddressOf : byte
{
Company,
Person
}
我的计划是有一个地址表,我将保留公司客户的地址等。
每个地址都有其唯一的id,并通过另一个所有者id和所有者类型列与地址的所有者关联
我通常的做法是在所有需要地址信息的表上都有地址列(然后我可以为nhibernate进行组件映射),但现在我认为这可能没有必要,我可以在一个公共表上收集所有地址
现在我的挑战是如何将这些映射到nhibernate。我想到了一对一的映射,但不知道如何映射应该由所有者/公司、个人等外来生成的owner\u id列
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
<class name="Company" table="Companiess">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" />
<property name="Phone" />
<property name="Fax" />
<one-to-one name="Address" class="Address" />
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Addresses" table="Addresses ">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="Address1" />
<property name="CityName" />
<property name="StateName" />
<property name="CountryName" />
<one-to-one "here is where im having trouble, I need to map owners id to owner_id column of Addresses table" ></one-to-one>
</class>
</hibernate-mapping>
如果你看到一个架构问题,也请让我知道,因为我以前没有这样使用过一个单独的地址表,我还没有完全适应它。
谢谢 您需要Company和Person类来实现公共接口。在地址中添加一个字段,该字段将跟踪行是否属于公司或个人。然后在主题上使用
。我不知道你为什么想要从地址到所有者的双向链接;那真的有必要吗?一个地址真的需要知道它的所有者是谁吗
你可能想考虑删除这个关系,并提出一个通用的“共享”关系类,比如:
public class Relation
{
public virtual string Name { get; set; }
public virtual string Phone { get; set;
public virtual string Fax { get; set; }
public virtual Address Address { get; set; }
}
而且
public class Person : Relation
{
}
public class Company : Relation
{
}
和映射文件:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
<class name="Relation" table="Relations">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" />
<property name="Phone" />
<property name="Fax" />
<Component name="Address" class="Address" >
... address fields...
</Component>
<joined subclass="Person..." />
<joined subclass="Company..." />
</class>
</hibernate-mapping>
... 地址字段。。。
这个方法让我考虑把地址字段放在同一个表而不是单独的表上,因为这看起来会使事情变得复杂很多。(如果这个问题没有更好的解决方案,我会把它标记为答案)