2010-04-08 21 views
0

我认为这是一个适度的新手问题。我一直在使用NHibernate/FluentNHibernate大约6个月左右,我想我对基础知识有一个很好的把握。现在我正在推动一点点。我确信这是有记录的,但我已经在谷歌上花了几个小时,而且还没有弄明白。流利的NHibernate一对一地加入表格

我有简单的类,把它简单:

public class Simple 
{ public string Name { get; set;} 
    public string Desc { get; set; } 
    public string Status { get; set;} 
} 

状态实际上是被限制为一小组值之一:“活动”,“保持”和“关闭”。在DB模式,我有一个名为RetrofitStatus一个简单的只读表:

CREATE TABLE [dbo].[RetrofitStatus](
[Status] [nvarchar](10) NOT NULL, 
[SortOrder] [smallint] NOT NULL, 
CONSTRAINT [PK_RetrofitStatus] PRIMARY KEY CLUSTERED 
(
    [Status] ASC 
) 

并有一个外键约束在简单的表,以确保状态是RetrofitStatus。

的RetrofitStatus表的目的是为包括SortOrder的列,这样我可以做到(在SQL)

SELECT * from Simple s join RetrofitStatus r on r.Status=s.Status ORDER BY r.SortOrder 

和我的结果(例如,所有的活动条目,然后再进行排序成显示顺序-HOLD条目,然后是CLOSED条目,因为我按逻辑顺序进行排序,而不是按字母顺序排序或其他任何轻松识别)。

我的问题是,我如何建模FNH中的对象和关系?我可以将SortOrder属性添加到我的Simple定义中,并创建一个表示该表示的View,但是当我尝试向表中插入新的Simple对象时会发生什么?显然,我不想尝试插入SortOrder属性。我认为我需要以某种方式使用NHib元素,但是我不清楚需要去哪里,插入内容会发生什么,以及如何在Fluent中执行此操作?

我要尝试试验一下试错法,但我想也许有人知道他们在做什么(我不知道)可以指引我走向正确的方向并为我节省一些时间。谢谢你的帮助。

回答

1

假设你有一个Simple类作如下修改(我不知道你在做什么有关键):

public class Simple 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Desc { get; set; } 
    public string Status { get; set; 
    public int SortOrder { get; set; } 
} 

你可以映射这样的:

public SimpleMap : ClassMap<Simple> 
{ 
    Id(x => x.Id).Unique().GeneratedBy.Native(); 
    Map(x => x.Name); 
    Map(x => x.Desc); 
    Join("RetrofitStatus", join => 
    { 
     join.KeyColumn("Status") 
      .Map(x => x.Status); 
     join.Map(x => x.SortOrder).Not.Insert(); 
    }); 
} 

我的天堂没有测试过这个,但这是它的要点。

您可以指定属性不能被插入或在映射分别使用Not.Insert()Not.Update(),更新,或既不能使用ReadOnly()插入也不更新。