我有一个简单的缓存来快速访问我的应用程序的一些元信息。
public class CacheList
{
[Key, Column(Order = 1)]
public Guid Key1{ get; set; }
[Key, Column(Order = 0)]
public Guid Key0{ get; set; }
public List<CacheItem> Items { get; set; }
public List<CacheFolder> Folders { get; set; }
}
public class CacheItem
{
[Key, Column(Order = 0)]
public Guid Key3 { get; set; }
[Key, Column(Order = 1)]
public Guid Key4 { get; set; }
public string Value { get; set; }
}
我会定期更新整个缓存。
为了简化它,我总是根据当前位置删除所有项目并创建新项目。
示例:
首先我删除所有相应的项目。 (列表本身也被删除并重新创建)
InsertContext.Items.RemoveRange(InsertContext.Items.Where(i => i.Key1 == key1.Id && i.ListId == key2.Id));
然后我将新项目添加到列表中
foreach (var item in items)
{
var dbitem = new CacheItem()
{ };
dbList.Items.Add(dbitem);
}
工作几乎完美......
我对外键字段有问题,它们是空的。
EF创建一个如下所示的插入语句:
Insert .... VALUES (@0, @1, @2, @3, @4, NULL, NULL)
如果我第一次缓存列表,它可以正常工作。从第二次运行开始,它的行为如上所述。
我很确定这是因为删除/添加交互,但我真的不知道如何解决问题。
当然我只能删除不再存在的项目并更新其余项目,但这会产生一些我想要阻止的开销。
整个过程在一个上下文中运行,最后一个SaveChanges
。
编辑:解决了问题:在将列表添加到上下文之前,我完成了对列表及其子元素的所有操作。