0

CascadeDelete RavenDB バンドルを介して、RavenDB を埋め込むこのアプリケーションにカスケード削除を実装しようとしていますが、バンドルがアクティブ化されていないようです。これについてどうすればよいですか?

以下のコード スニペットは、埋め込み/インメモリ RavenDB データベースでカスケード削除を有効にしようとするテスト コンソール アプリケーションです。それのための:

using System;
using System.Linq;
using Raven.Client;
using Raven.Client.Embedded;
using Raven.Json.Linq;

namespace ConsoleApplication1
{
    public class Parent
    {
        public string Id { get; set; }
    }

    public class Child
    {
        public string Id { get; set; }
        public string ParentId { get; set; }
    }

    public static class RavenExtensions
    {
        public static void AddCascadeDeleteReference(this IAdvancedDocumentSessionOperations session,
            object entity, params string[] documentKeys)
        {
            var metadata = session.GetMetadataFor(entity);
            if (metadata == null)
                throw new InvalidOperationException(
                  "The entity must be tracked in the session before calling this method.");

            if (documentKeys.Length == 0)
                throw new ArgumentException(
                  "At least one document key must be specified.");

            const string metadataKey = "Raven-Cascade-Delete-Documents";

            RavenJToken token;
            if (!metadata.TryGetValue(metadataKey, out token))
                token = new RavenJArray();

            var list = (RavenJArray)token;
            foreach (var documentKey in documentKeys.Where(key => !list.Contains(key)))
                list.Add(documentKey);

            metadata[metadataKey] = list;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var store = new EmbeddableDocumentStore { RunInMemory = true };
            store.Initialize();
            Parent parent;
            using (var session = store.OpenSession())
            {
                parent = new Parent();
                session.Store(parent);
                session.SaveChanges();

                var child = new Child();
                child.ParentId = parent.Id;
                session.Store(child);
                session.Advanced.AddCascadeDeleteReference(parent, child.Id);
                session.SaveChanges();
            }

            using (var session = store.OpenSession())
            {
                Console.WriteLine("Before deleting parent:");
                foreach (var child in session.Query<Child>())
                {
                    Console.WriteLine("  Child: {0} of parent {1}", child.Id, child.ParentId);
                }

                parent = session.Load<Parent>(parent.Id);
                session.Delete(parent);
                session.SaveChanges();

                Console.WriteLine("After deleting parent:");
                foreach (var child in session.Query<Child>())
                {
                    Console.WriteLine("  Child: {0} of parent {1}", child.Id, child.ParentId);
                }

                Console.WriteLine("Press any key...");
                Console.ReadKey();
            }
        }
    }
}

このアプリを実行すると、カスケード削除を使用するように構成されているにもかかわらず、子が親と共に削除されていないことがわかります。このプログラムでカスケード削除を機能させる方法を指摘してください:)

アップデート:

の後に次を追加しようとしましたstore.Initialize();が、違いはありません。

store.DocumentDatabase.Configuration.Catalog.Catalogs.Add(
            new AssemblyCatalog(typeof(CascadeDeleteTrigger).Assembly));
4

2 に答える 2

2

埋め込みモードになっているため、次の 2 つのオプションがあります。

  1. バンドル dll を plugins ディレクトリにコピーできます。

  2. バンドル dll を参照してから、カタログに手動で追加できます。

    documentStore.DocumentDatabase.Configuration.Catalog.Catalogs
        .Add(new AssemblyCatalog(typeof(CascadeDeleteTrigger).Assembly));
    

ただし、両方を行わないでください。オプション #2 を使用する場合、バンドル dll は plugins フォルダーにあるべきではありません。そうしないと、2 回取得されます。

于 2013-02-21T14:45:03.510 に答える
0

やや直感に反しますが、RavenDBで取得できるように、ファイルを出力ディレクトリにコピーするようにVisualStudioにコピーpackages\RavenDB.Bundles.CascadeDelete.2.5.2505-Unstable\lib\net40\Raven.Bundles.CascadeDelete.dllして構成する必要があることがわかりました。ConsoleApplication1\Plugins\Raven.Bundles.CascadeDelete.dll

これで、CascadeDeleteバンドルが機能し、子が親とともに削除されます。

ここに画像の説明を入力してください

于 2013-02-21T09:54:00.833 に答える