如何使用(Fluent)NHibernate正确使用“静态数据”

时间:2015-01-30 09:41:37

标签: c# design-patterns nhibernate fluent-nhibernate

在我们的数据库中,我们有"静态数据"其中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初始化枚举。关于如何实现这一目标的任何想法/提示?

1 个答案:

答案 0 :(得分:2)

我同意你的看法enum是更好的选择 以下是如何实现此目的的示例:

1.创建枚举:

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

2.将 ClassId 属性的类型从 int 更改为 CardClassId

public virtual CardClassId ClassId { get; set; }

3.更改您的地图(如果它不是这样的话):

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

4.更改您的代码,所以它看起来像这样:

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 设置为已分配,并且您的枚举项应将其值设置为与数据库中相同的值。