web-dev-qa-db-ja.com

MongoDB C#ドライバー:挿入時にプロパティを無視

私はオフィシャルMongoDB C#ドライブv0.9.1.26831を使用していますが、POCOクラスが与えられたのではないかと思っていました。

たとえば、次のクラスがあります。

public class GroceryList
{
    public string Name { get; set; }
    public FacebookList Owner { get; set; }
    public bool IsOwner { get; set; }
}

GroceryListオブジェクトを挿入したときにIsOwnerが挿入されないようにする方法はありますか?基本的には、データベースからオブジェクトをフェッチしてから、アプリレイヤーでIsOwnerプロパティを設定し、それをコントローラーに返します。コントローラーは、オブジェクトをビューモデルにマップします。

私の質問が理にかなっているといいのですが。ありがとう!

38
Abe

[BsonIgnore]属性が機能したようです。

public class GroceryList : MongoEntity<ObjectId>
{
    public FacebookList Owner { get; set; }
    [BsonIgnore]
    public bool IsOwner { get; set; }
}
56
Abe

または、何らかの理由で属性を使用したくない場合(たとえば、MongoDB.Bsonへの追加の依存関係をDTOに持ち込みたくない場合)、次のようにすることができます。

BsonClassMap.RegisterClassMap<GroceryList>(cm =>
{
  cm.AutoMap();
  cm.UnmapMember(m => m.IsOwner);
});
16
iredchuk

また、IsOwnerをNull可能にして、[BsonIgnoreExtraElements]を穴クラスに追加することもできます。

[BsonIgnoreExtraElements]
public class GroceryList : MongoEntity<ObjectId>
{
    public FacebookList Owner { get; set; }
    public bool? IsOwner { get; set; }
}

Null値を持つプロパティは、シーラライゼーション中に無視されます。しかし、私は[BsonIgnore]があなたのケースに適していると思います。

16
Andrew Orsich

おそらく、2つの属性BsonIgnoreExtraElementsとBsonIgnoreを組み合わせるを使用する必要があります。その理由は、BsonIgnoreはDBに「IsOwner」プロパティを挿入しませんが、このフィールドを含む「古い」インスタンスがDBにあり、フィーチャーのモデルからこのフィールドを削除するか、「GroceryList」を拡張する場合です"クラスを作成し、DBで新しいクラスを使用すると、例外が発生します。

「要素 'IsOwner'はクラスのどのフィールドまたはプロパティとも一致しません。」

(モデルクラスを編集する代わりに)別の方法は、「Register Class Map」と「SetIgnoreExtraElements」および「UnmapMember」を一緒に使用することです。

あなたのケースでは、ドライバを初期化するときにこのコードを追加するだけです:

BsonClassMap.RegisterClassMap<UserModel>(cm =>
{
     cm.AutoMap();
     cm.SetIgnoreExtraElements(true);
     cm.UnmapMember(m => m.IsOwner);
});

Mongoクラスマッピングの詳細については、以下を参照してください。

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/

4

誰かが別の方法で興味を持っているかもしれない場合に備えて。規約による:

public class IgnoreSomePropertyConvention : ConventionBase, IMemberMapConvention
{
    public void Apply(BsonMemberMap memberMap)
    { // more checks will go here for the case above, e.g. type check
        if (memberMap.MemberName != "DoNotWantToSaveThis")
            memberMap.SetShouldSerializeMethod(o => false);
    }
}

そして、あなたはあなたのアプリの起動中に一度この規則を登録する必要があります:

ConventionRegistry.Register("MyConventions", new ConventionPack { new IgnoreBaseIdConvention()  }, t => true);
3
Felix