2011-03-18 125 views
0

有没有一种方法可以为没有直接引用另一个表的表设置映射?它实际上得到它是从另一个表,我有一个直接参考。流利的NHibernate - 独立表映射

这是我到目前为止,但我不知道如何映射我的元数据模型中的“LookupValue”。如果[mdd] .DefinitionType等于[mdl] .LookupType且[md] .DataValue等于[mdl] .LookupKey,则需要映射到MetaData。

public class MetaData { 
    public virtual long TableID { get; set; } 
    public virtual MetaDataDefinition Definition { get; set; } 
    public virtual int DefinitionID { get; set; } 
    public virtual String DataValue { get; set; } 
    public virtual MetaDataLookup LookupValue { get; set; } 

    public override bool Equals(object obj) { ... } 
    public over int GetHashCode() { ... } 
} 

public class MetaDataDefinition { 
    public virtual long ID { get; set; } 
    public virtual string DefinitionName { get; set; } 
    public virtual string DefinitionType { get; set; } 
} 

public class MetaDataLookup { 
    public virtual string Type { get; set; } 
    public virtual string LookupKey { get; set; } 
    public virtual string LookupValue { get; set; } 

    public override bool Equals(object obj) { ... } 
    public over int GetHashCode() { ... } 
} 

public class MetaDataMap : ClassMap<MetaData> { 
    public MetaDataMap() { 
     Table("PPOMetaData"); 
     CompositeId() 
      .KeyProperty(x => x.TableID, "TableID") 
      .KeyProperty(x => x.DefinitionID, "DefinitionID"); 

     References(x => x.Defintion, "DefinitionID").Not.LazyLoad().Cascade.All().Fetch.Join(); 
     Map(x => x.TableID); 
     Map(x => x.DataValue); 
    } 
} 
public class MetaDataDefinitionMap : ClassMap<MetaDataDefinition> { 
    public MetaDataDefinitionMap() { 
     Table("MetaDataDefinitions"); 
     Id(x => x.ID); 
     Map(x => x.DefinitionName); 
     Map(x => x.Type); 
    } 
} 

public class MetaDataLookupMap : ClassMap<MetaDataLookup> { 
    public MetaDataLookupMap() { 
     CompositeId() 
      .KeyProperty(x => x.LookupType) 
      .KeyProperty(x => x.LookupKey); 
     Map(x => x.LookupValue); 
    } 
} 

理想情况下,我想拥有它运行一个类似的查询:

SELECT  data.TableID, data.DefinitionID, def.DefinitionName, data.DataValue,lu.LookupValue AS DataValue 
FROM   dbo.PPOMetadata AS data 
    INNER JOIN dbo.MetaDataDefinitions AS def ON def.ID = data.DefinitionID 
    LEFT OUTER JOIN dbo.MetaDataLookup AS lu ON lu.LookupType = def.Type AND lu.LookupKey = data.DataValue 
WHERE data.TableID = 1 

在更新的能力,我会永远创建,更新或删除将在元数据中的唯一条件表。定义和查找值永远不会改变(至少从应用程序的这部分)。是否可以将“MetaDataLookup”直接映射到MetaData模型?如果是这样,有人能指出我应该看到的正确方向吗?

谢谢!

回答

0

我想出了一个解决方法,似乎正在工作,并可能需要一些复杂性。我没有试图处理一个ClassMap中的复杂联接,而是在Sql Server中为我做了这个视图。在我的应用程序中,我为视图构建了一个新的Model和ClassMap。我还没有实现任何更新逻辑,但是我认为我将在MetaData模型上直接使用更新逻辑,而读取逻辑(需要所有内容连接在一起)将使用新的MetaDataView模型。

我还是很好奇,如果这样的复杂连接可能在流利NHibernate,但现在这个解决方案似乎是为我工作。