我有一个函数将一堆“ImageSignatures”写入DbContext:
using (var db = new ImageContext())
{
foreach (var file in files)
{
var sig = new ImageSignature
{
FileName = file,
Signature = Signature(file),
};
Console.WriteLine("{0}: {1}", Path.GetFileName(sig.FileName), Sig2Str(sig.Signature));
if (sig.Signature != null)
{
db.Images.Add(sig);
}
}
try
{
records = db.SaveChanges(); // where the heck is this saving to!?
}
...
Signature
属性定义为
[MinLength(420)]
[MaxLength(420)]
[Required]
public sbyte[] Signature { get; set; }
如果我在添加sig
之前放置一个断点,我可以看到它不是null,而是一个像我期望的420字节数组。
在稍后运行的应用程序中,我尝试遍历我插入的ImageSignatures,
foreach (var img1 in db.Images)
{
var set = new List<string> { img1.FileName };
foreach (var img2 in db.Images)
{
if (Distance(img1.Signature, img2.Signature) < 0.6)
{
set.Add(img2.FileName);
}
}
if (set.Count > 1)
{
dupeSets.Add(set);
}
}
但Signature
总是回归为空。这是怎么回事?当我保存它时,它是如何变为空的,当它不为空时?
答案 0 :(得分:0)
确保在处理之前已将更改保存到DbContext,这将确保在基础数据存储中保留这些更改:
using (var db = new ImageContext())
{
foreach (var file in files)
{
var sig = new ImageSignature
{
FileName = file,
Signature = Signature(file),
};
Console.WriteLine("{0}: {1}", Path.GetFileName(sig.FileName), Sig2Str(sig.Signature));
db.Images.Add(sig);
}
db.SaveChanges();
}