如何在 (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 属性 的类型从 int 到 CardClassId:
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,并且您的枚举项的值应设置为与您的数据库。
在我们的数据库中,我们有 "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 属性 的类型从 int 到 CardClassId:
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,并且您的枚举项的值应设置为与您的数据库。