请帮助我将这个简单流畅的nhibernate映射带入生活

本文关键字:nhibernate 映射 生活 帮助 简单 | 更新日期: 2023-09-27 18:04:44

这一切似乎都很简单,但我还是找不到我的问题的答案。

假设我有两个表TableA和TableB,它们可以保存对第三个表的单个引用:

TableA       TableB        TableC
ID           ID            ID
TableC_ID    TableC_ID     RandomDataC
RandomDataA  RandomDataB

每个都由以下类表示:

public Class ClassA{
  public virtual int Id{get;set;}
  public virtual ClassC ObjAC{get;set;}
  ...
}
public Class ClassB{
  public virtual int Id{get;set;}
  public virtual ClassC ObjBC{get;set;}
  ...
}
public Class ClassC{
  public virtual int Id{get;set;}
  ...
}

正如你所看到的,ClassA和ClassB拥有一个名为ClassC的属性。

我已经尝试了以下映射(在其他…)

 public Class ClassAMap : ClassMap<ClassA>{
    public ClassAMap(){
       Id(x => x.Id);
       HasOne(x => x.ObjAC).Cascade.All();
       ...
    }
 }
 public Class ClassBMap : ClassMap<ClassB>{
    public ClassBMap(){
       Id(x => x.Id);
       HasOne(x => x.ObjBC).Cascade.All();
       ...
    }
 }
 public Class ClassCMap : ClassMap<ClassC>{
    public ClassCMap(){
       Id(x => x.Id);
    }
 }

但是映射不正确。我试过ClassCMap有一个参考,但没有成功。

请帮…

请帮助我将这个简单流畅的nhibernate映射带入生活

试试这个:

public Class ClassAMap : ClassMap<ClassA>{
    public ClassAMap(){
       Id(x => x.Id);
       References(x => x.ObjAC, "TableC_ID").Cascade.All();
       ...
    }
 }
 public Class ClassBMap : ClassMap<ClassB>{
    public ClassBMap(){
       Id(x => x.Id);
       References(x => x.ObjBC, "TableC_ID").Cascade.All();
       ...
    }
 }
 public Class ClassCMap : ClassMap<ClassC>{
    public ClassCMap(){
       Id(x => x.Id);
    }
 }

您可能还需要确保推断出正确的表名。问题是HasOne映射到一个实体基于表的主键的映射。

当使用HasOne时,这意味着您的表与另一个表共享相同的主键。在你的情况下,这不是真的。类A、B和C都有自己的id。查看下面的文章,详细解释了这一点:

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

您可能需要使用References而不是HasOne。HasOne有一个独特的用例。将HasOne替换为References。我不相信。cascade。all()也是必要的。

你可以在这里查看HasOne的用法:http://wiki.fluentnhibernate.org/Fluent_mapping.