0

「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; }

を追加する直前にブレークポイントを配置すると、signull ではなく、予想どおり 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、常にnullとして戻ってきます。それがどうなったのか?保存したときはnullではなかったのに、どうやってnullになったのですか?

4

1 に答える 1

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();
}
于 2013-05-23T06:19:52.273 に答える