.net – 在WPF中缓存大量实体

我正在
WPF中编写一个应用程序.我正在使用Entity Framework 5,并且想知道您是否可以就如何处理以下情况向我提供建议.

我基本上只有三张桌子:

商品{ID,Name}

属性{ID,Name,Type}

AttributeValue {ItemID,AttributeID,Value}

我们的客户想要为他的物品添加属性,这看起来效果很好.现在,他可以添加属性并为其项目分配值.第一个问题:你认为这是好设计吗?

现在的问题是如何在WPF DataGrid中显示项目并将所有属性显示为列.这就是我们现在拥有的:

我们以编程方式生成列:

foreach (var attribute in db.Attributes)
{
    datagrid.Columns.Add(new DataGridTextColumn
    {
        Header = attribute.Name,
        Binding = new Binding { Path = new PropertyPath(string.Format("[{0}]", attribute.ID)) }
    });
}

这很好用.现在的问题是如何在Items-Class中实现索引器.我们有一个选项,大量数据变得非常慢(20.000个项目,400个属性,每个项目有100个值):

public AttributeValue this[int i]
{
    get
    {
        return AttributeValues.FirstOrDefault(aa => aa.AttributID == i);
    }
}

就像我说的,这有效,但它变得缓慢.而不是总是查询属性值我想到缓存一切之前显示如下:

var items = db.Items.AsNoTracking().ToArray();
CachedValues.Values = new Dictionary<int, Dictionary<int, AttributeValue>>(items.Length);
foreach (var item in items)
{
    var attributevalues = db.AttributeValue.AsNoTracking().Where(w => w.ArtikelID == item.ID).ToArray();
    CachedValues.Values[item.ID] = new Dictionary<int, AttributeValue>(attributevalues.Length);
    foreach (var value in attributevalues)
    {
        CachedValues.Values[item.ID][value.AttributeID] = value;
    }
}

我使用静态类作为缓存:

public static class CachedValues
{
    public static Dictionary<int, Dictionary<int, ArtikelAttribut>> Values;
}

然后在Items-Class中我可以访问缓存:

public AttributeValue this[int i]
{
    get
    {
        AttributeValue val = null;
        CachedValues.Values[ID].TryGetValue(i, out val);
        return val;
    }
}

显然,初始化缓存需要一些时间(15s),但后来要快得多.按datagrids中的属性对项目进行排序只需要一秒钟.使用另一种方法需要很长时间.

我对解决方案不满意,你有什么建议吗?我会赞赏任何批评(我知道两者都不是好的解决方案).

谢谢,

托马斯

编辑

为了使第一个问题更清楚一个小例子:

物品:Item1,Item2,Item3,……
属性:宽度,高度,速度,……
AttributeValues 🙁 Item1,Width,100),(Item1,Height,200),(Item2,Width,100),(Item3,Height,200),(Item3,Speed,40)

所以这是一个经典的多对多关系.属性可能出现在0多个项目中,而项目可能具有0多个属性.

最佳答案 你的数据模型是一个非常通用的解决方案,有支持和反对它的论据,但没有更多的背景很难判断,所以我将跳过这部分问题.

我可能会像你一样实现类似的缓存,但稍作修改.

>我不会使用全局静态缓存,而是每个实体只有一个字典缓存此实体的属性值.这样,如果实体超出范围,您就不必关心从全局缓存中删除条目,因为缓存会与实体一起收集垃圾.
>我不会预先填充字典,而是先尝试从缓存中获取值,如果不存在,请搜索属性值列表并按需更新缓存.如果应用程序运行良好并且不能同时访问所有值 – 例如,因为只有一些数据在网格中可见,而其他行不可见 – 这可以在一段延长的时间内无缝地分配缓存填充过程并使用户无法察觉.

最后的想法 – 20,000个项目,每个400个属性?哪个用户应该能够同时处理多达8,000,000个值的应用程序?也许您还应该考虑重新设计用户界面和交互逻辑 – 没有人需要并且可以一次处理那么多信息.

点赞