3

たとえば、BsonDocuments のコレクションがあります。

MongoCollection<BsonDocument> products;

コレクションに挿入するときは、メンバー名を常に小文字にしたいと考えています。ドキュメントを読んだ後、ConventionPack が最適なようです。したがって、次のように定義しました。

    public class LowerCaseElementNameConvention : IMemberMapConvention
{
    public void Apply(BsonMemberMap memberMap)
    {
        memberMap.SetElementName(memberMap.MemberName.ToLower());
    }

    public string Name
    {
        get { throw new NotImplementedException(); }
    }
}

そして、コレクション インスタンスを取得した直後に、次のように規則を登録します。

        var pack = new ConventionPack();
        pack.Add(new LowerCaseElementNameConvention());
        ConventionRegistry.Register(
            "Product Catalog Conventions",
            pack,
            t => true);

残念ながら、これは私のコレクションに保存されているものにはまったく影響しません。デバッグしたところ、Apply メソッドが呼び出されないことがわかりました。

コンベンションを機能させるには、どうすればよいですか?

4

3 に答える 3

2

IMemeberMapConvention を使用するには、マッピング プロセスを実行する前に、必ず規則を宣言する必要があります。または、必要に応じて既存のマッピングを削除して、新しいマッピングを作成します。

たとえば、規則を適用する正しい順序は次のとおりです。

        // first: create the conventions
        var myConventions = new ConventionPack();
        myConventions.Add(new FooConvention());

        ConventionRegistry.Register(
           "My Custom Conventions",
           myConventions,
           t => true);

        // only then apply the mapping
        BsonClassMap.RegisterClassMap<Foo>(cm =>
        {
            cm.AutoMap();
        });

        // finally save 
        collection.RemoveAll();
        collection.InsertBatch(new Foo[]
                               {
                                   new Foo() {Text = "Hello world!"},
                                   new Foo() {Text = "Hello world!"},
                                   new Foo() {Text = "Hello world!"},
                               });

このサンプル規則の定義方法は次のとおりです。

public class FooConvention : IMemberMapConvention

    private string _name = "FooConvention";

    #region Implementation of IConvention

    public string Name
    {
        get { return _name; }
        private set { _name = value; }
    }

    public void Apply(BsonMemberMap memberMap)
    {
        if (memberMap.MemberName == "Text")
        {
            memberMap.SetElementName("NotText");
        }
    }

    #endregion
}

これらは、このサンプルを実行したときに出た結果です。Text プロパティが「NotText」として保存されていることがわかります。

NotText プロパティを使用して Foos テーブルを出力する

于 2013-08-14T03:50:30.227 に答える
1

私の理解が正しければ、規則は自動マッピング時にのみ適用されます。クラスマップがある場合は、明示的に呼び出しAutoMap()て規約を使用する必要があります。次に、自動マッピングを変更できます。たとえば、次のようになります。

public class MyThingyMap : BsonClassMap<MyThingy>
{
    public MyThingyMap()
    {
        // Use conventions to auto-map
        AutoMap(); 

        // Customize automapping for specific cases
        GetMemberMap(x => x.SomeProperty).SetElementName("sp"); 
        UnmapMember(x => x.SomePropertyToIgnore);
    }
}

クラスマップを含めない場合、デフォルトでは自動マッピングのみが使用されると思います。その場合、規則が適用されます。を呼び出す前に、規則を登録していることを確認してくださいGetCollection<T>

于 2013-05-16T14:55:31.463 に答える