如何在 (Fluent) NHibernate 中正确使用 "static data"

How to use "static data" properly with (Fluent) NHibernate

在我们的数据库中,我们有 "static data",其中 ID 是手动分配的,并且在项目的整个生命周期中它们都是相同的。在不同的地方,我们检查对象是否与这些静态数据具有相同的 id,例如:

public static void UpdateSlotCapacity(MagazineSlot slot)
{
    using (var session = SessionManager.OpenSession())
    {
        session.Lock(slot, LockMode.Upgrade);

        if (slot.Card.CardClass.ClassId == 9 || slot.Card.CardClass.ClassId == 2 ||
            slot.Card.CardClass.ClassId == 3 ||
            slot.Card.CardClass.ClassId == 5 || slot.Card.CardClass.ClassId == 7)
        {
            Dialogs.ShowInfo("Capacity update is not allowed for " + slot.Card.CardClass.ClassName + " cards");
            return;
        }
    }
}

尽管如此,在代码中使用 id 数据永远不会改变真的很糟糕,我想将其更改为更具可读性和可维护性的结构。我正在考虑使用 enum 但我不确定我应该如何使用流畅的 nhibernate 初始化枚举。 ideas/tips 关于如何实现这一点的任何信息?

我同意你的看法,enum 会是更好的选择。
以下是如何实现此功能的示例:

1.Create 枚举:

public enum CardClassId {
    ClassA = 1,
    ClassB = 2,
    ClassC = 3,
    ...
}

2.Change ClassId 属性 的类型从 intCardClassId:

public virtual CardClassId ClassId { get; set; }

3.Change 你的映射(如果它不是这样的话):

Id(x => x.ClassId).GeneratedBy.Assigned();

4.Change 你的代码,所以它看起来像这样:

public static void UpdateSlotCapacity(MagazineSlot slot)
    {
        using (var session = SessionManager.OpenSession())
        {
            session.Lock(slot, LockMode.Upgrade);

            if (slot.Card.CardClass.ClassId == CardClassId.ClassI ||
                slot.Card.CardClass.ClassId == CardClassId.ClassB ||
                slot.Card.CardClass.ClassId == CardClassId.ClassC ||
                slot.Card.CardClass.ClassId == CardClassId.ClassE ||
                slot.Card.CardClass.ClassId == CardClassId.ClassG)
            {
                Dialogs.ShowInfo("Capacity update is not allowed for " + slot.Card.CardClass.ClassName + " cards");
                return;
            }
        }
    }

您不必太担心映射,因为 NHibernate 会自动从数据库整数转换为您的枚举。请记住,您必须将 GeneratedBy 设置为 Assigned,并且您的枚举项的值应设置为与您的数据库。