【发布时间】:2023-03-30 08:46:01
【问题描述】:
我有一个模拟模型,它使用数据库存储输入和输出数据,使用实体框架和数据库优先方法。通过数据访问层或多或少地查询数据库,如下所述:https://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework/
但是,使用的一些静态输入数据不存储在数据库中,而是作为字段硬编码到应用程序中。此数据是真正的静态数据,在应用程序运行时不会更改。例如:
public class Currency
{
public string Symbol { get; private set; }
public string Name { get; private set; }
private Currency()
{
}
// Fields like this store reference data
public static readonly Currency USD = new Currency
{
Symbol = "USD",
Name = "US Dollar"
};
public static readonly Currency EUR = new Currency
{
Symbol = "EUR",
Name = "Euro"
};
}
这样做的好处是引用参考数据就像使用例如Currency.USD 贯穿整个模型,无需经过数据访问层。这种实现方式的缺点是数据模型很笨拙并且不再是真正的关系(在某种意义上,关系是通过外键强制执行的);使用上述参考数据的模型对象,例如
public class Transaction
{
public int Id { get; set; }
public Currency Currency { get; set; }
public double Price { get; set; }
}
在数据库中有一个如下所示的后备表:
create table Transaction
(
Id int not null primary key,
Currency nvarchar(3) not null , -- Currency symbol, not a foreign key
Price float not null
);
货币属性在通过业务层读写时在字符串和对象之间来回转换。
我想用以下目标重写它:
- 将静态参考数据与所有其他数据一起存储在数据库中,以保持数据模型的清洁。
- 不必每次需要静态参考数据时都查询数据访问层(即尽可能接近硬编码的
Currency.USD)。在整个模拟运行过程中,参考数据可能会在启动时读取一次,然后查询 1,000,000,000 次。
我在这里寻找某种缓存机制吗?这可能足够高效吗?一般而言,特别是对于实体框架来说,解决这个问题的优雅方法是什么?
谢谢。
【问题讨论】:
-
由于每个查找对象都具有除了名称之外的属性,因此枚举本身可能是不够的(除非我误解了文章,对 VB 不太熟悉)。但现在我想一想,我要寻找的本质上是一个具有属性的枚举,或者尽可能接近的东西。
-
看看this post,它包含有关如何在 C# 中获取类似 java 的枚举(带有属性)的答案。我认为this answer 可能适合您与 EF 相关的情况,您可以通过缓存属性收集部分对其进行一些优化。
-
另外,如果您只使用 2 个属性,那么符号 = 值和名称 = 描述。这正是我们为货币所做的。我们可以根据需要参考。
-
@RMH 有趣的方法,我会测试类似的东西。我想我们可以使用枚举来保存参考数据的标签(可以这么说),而实际数据(即其他所有数据)来自装饰每个枚举值并从数据库加载的属性。不过,不确定生成的数据模型会是什么样子。
标签: c# entity-framework oop design-patterns data-modeling