2012-03-29 47 views
1

假设我有两个表:加入表映射与逆FK

表MY_ENTITY

ID: PK 
OTHER_ID: FK to table OTHER 

表中的其他

ID: PK 
COL: The column I want 

我的实体是这样的:

class MyEntity : Entity 
{ 
    public virtual Column { get; set; } 
} 

我的自动映射覆盖看起来像这样:

mapping.IgnoreProperty(x => x.Column); 
mapping.Join("OTHER", x => x.KeyColumn("ID").Optional() 
          .Map(y => y.Column, "COL"); 

这工作正常,执行没有问题,但连接是错误的。

它创建一条SQL语句,将MY_ENTITY的PK连接到表OTHER中的KeyColumn中指定的列。沿着线的东西:

select ... from MY_ENTITY e left outer join OTHER o on e.ID = o.ID 

不过,我需要的连接是这样的:

select ... from MY_ENTITY e left outer join OTHER o on e.OTHER_ID = o.ID 

如何实现这一目标?

回答

1

你就必须将OtherId属性添加到MyEntity(它不必是公共的,它只是用于映射)和连接键映射使用PropertyRef(这是由代码映射方法名;它是property-ref在XML中,您必须查看Fluent)

或者,将Other作为一个实体并使用ReferenceMyEntity。你可以级联所有,所以它与MyEntity一起被持续/删除。

然后,就项目所引用的属性(它不会myEntity所映射):

class MyEntity 
{ 
    public virtual PropertyType Property 
    { 
     get 
     { 
      EnsureOther(); 
      return Other.Property; 
     } 
     set 
     { 
      EnsureOther(); 
      other.Property = value; 
     } 
    } 

    void EnsureOther() 
    { 
     if (Other == null) 
      Other = new Other(); 
    } 

    public virtual Other { get; set; } 
} 

class Other 
{ 
    public virtual PropertyType Property { get; set; } 
} 
+0

谢谢!该投影是一个不错的主意,它直接解决了我的下一个问题:“如何正确坚持一个具有PK连接表的实体”? :-) – 2012-03-29 11:50:05

1

也许你应该使用Referencesmany-to-one)映射来代替。

References(x => x.Other, "OTHER_ID") 
    .Fetch.Join() 
+0

是的,Diego就是这么建议的。 – 2012-03-29 11:56:39

+0

是的,当我完成这个时,我看到了一个答案弹出。 – 2012-03-29 11:58:09