2009-05-18 187 views
0

我想映射一个遗留数据库在这里,我遇到了一个问题。在我的模式中,我有一个模块的概念和变量的概念。每个模块由一个或多个变量组成,每个变量都具有特定于该模块的属性。一个可变的坐在一个关系。映射NHibernate多对多

根据下面的类映射ModuleVariable的最佳方式是什么,对于我来说,看起来就像是一个具有特殊属性的多对多关系。

这里是类:

public class Relation 
{ 
    public virtual string RelationId 
    { 
     get; 
     set; 
    } 
} 

public class Variable 
{ 
    public virtual string VariableId 
    { 
     get; 
     set; 
    } 

    public virtual Relation RelationId 
    { 
     get; 
     set; 
    } 
} 

public class Module 
{ 
    public virtual string ModuleId 
    { 
     get; 
     set; 
    } 
} 

public class ModuleVariable 
{  
    public virtual Module ModuleId 
    { 
     get; 
     set; 
    } 

    public virtual Variable VariableId 
    { 
     get; 
     set; 
    } 

    public virtual Relation RelationId 
    { 
     get; 
     set; 
    } 

    public virtual Variable DownloadID 
    { 
     get; 
     set; 
    } 

    public virtual Variable UploadID 
    { 
     get; 
     set; 
    } 

    public string Repeatable 
    { 
     get; 
     set; 
    } 
} 
+0

如果您还发布了示例模式,您将获得更好的帮助。 – Min 2009-05-18 14:07:26

回答

2

要与像的关系带来额外的性能的许多一对多的关系,你将不得不作出ModuleVariable域实体和Module分别映射它和Variable

ModuleVariable将具有ModuleVariable实体的集合,并且ModuleVariable将具有对其他两个的多对一引用。例如:

<!-- Module mapping --> 
<bag name="ModuleVariables" inverse="true"> 
    <key column="Module_id" /> 
    <one-to-many class="ModuleVariable" /> 
</bag> 

<!-- ModuleVariable mapping --> 
<many-to-one name="Module" column="Module_id" /> 
0

多对多只能在桌面上工作,没有额外的属性。 这是因为多对多表示其他实体内部的项目集合。

如果您的表ModuleVariable没有其他列,你可以使用这样的:

<bag name="Modules" table="MODULE_VARIABLE" cascade="save-update" lazy="true" > 
    <key> 
    <column name="Variable_Id" not-null="true"/> 
    </key> 
    <many-to-many class="Module"> 
    <column name="Module_Id" not-null="true"/> 
    </many-to-many> 
</bag> 

而在你的领域类:

public IList Modules { get; set; } 

及使用,您应该添加模块:

variable.Modules.Add(module); 

希望有所帮助。