0

我认为这是一个适度的新手问题。我已经使用 NHibernate/FluentNHibernate 大约 6 个月了,我认为我对基础知识有相当的了解。现在我正在推动一点点。我确定这已记录在案,但我现在在 Google 上花了几个小时,还没有完全弄清楚。

我有简单的课程,称之为简单:

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

状态实际上被限制为一小组值之一:“ACTIVE”、“ON-HOLD”和“CLOSED”。在 DB 模式中,我有一个名为 RetrofitStatus 的简单只读表:

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

Simple 表上有一个外键约束,以确保 Status 处于 RetrofitStatus 中。

RetrofitStatus 表的目的是包含 SortOrder 列,以便我可以(在 SQL 中)

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

并将我的结果按显示顺序排序(例如,首先是所有 ACTIVE 条目,然后是 ON-HOLD 条目,然后是 CLOSED 条目,因为我按逻辑顺序排序,而不是按字母顺序或其他任何容易识别的顺序)。

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

我将尝试尝试反复试验,但我认为也许知道他们在做什么(我不知道)的人可以为我指明正确的方向并节省我一些时间。谢谢你的帮助。

4

1 回答 1

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()

于 2010-04-10T11:33:58.273 回答