Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类设计与NHibernate映射问题_C#_Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# 类设计与NHibernate映射问题

C# 类设计与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

我有一个地址类,我想用于其他对象的地址信息。下面我粘贴了两个使用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 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>

... 地址字段。。。

这个方法让我考虑把地址字段放在同一个表而不是单独的表上,因为这看起来会使事情变得复杂很多。(如果这个问题没有更好的解决方案,我会把它标记为答案)