2011-06-29 13 views
8

埋め込みドキュメントの配列を含むmongoドキュメントがあります。埋め込みドキュメントには、 "Id"という名前のプロパティがあります。mongo C#ドライバを含む埋め込みドキュメントのIdプロパティ名を維持

私のC#のマッピングオブジェクトは、(明らかに簡素化、)このようになり
{ Name: "Outer object", Embedded: [ {Name: "Embedded A", Id: "5f1c591a71dc237199eeaeda"} ] } 

public class Outer 
{ 
    public string Name { get; set; } 
    public IEnumerable<Inner> Inners { get; set; } 
} 

public class Inner 
{ 
    public string Name { get; set; } 
    public string Id { get; set; } 
} 

私は、データベースへの外側を書き込むと、C#のドライバはにInner.Idプロパティの名前を変更します_id。この自動リネームを回避するにはどうすればよいですか? Idプロパティで[BsonElement( "Id")]属性を使用しようとしましたが、それは役に立ちませんでした。

答えて

11

のMongoDBのドキュメントexplicitly states

のMongoDB内の文書を一意に識別するキー、_idを有することが要求されています。一方

は、C#のプロパティは、通常、パスカルケースであり、ドライバの設計者にプレフィックスを使用しないapparently decided力マッピングId_idにデータベース属性。あなただけMongoDBのIdと呼ばれるように起こる非_id属性をバインドしたい場合は

、あなたがId以外の名前を持つ別のC#のプロパティを宣言することができので、ドライバーはそれを妨げることはありません。

public class Inner 
{ 
    public string Name { get; set; } 

    [BsonElement("Id")] 
    public string IdStr { get; set; } 
} 
+0

これは私の推測ですが、私は自分でMongoDBを使ったことはありません。 –

+1

プロパティの名前をIdStrに変更し、プロパティに[BsonElement( "Id")]属性を追加しました。それはうまくいった。ありがとう! –

+0

この回答ありがとうございます。私たちが今日追いかけている問題について説明します。地図をどのようにオーバーライドしても問題ありません。彼らはどんな動きをしていますか? :/ –

1

私はコメントできませんので、新しい回答を書いてください。私のメモは人の時間を節約します。 MongoDBの中にあなたの_idは、あなたには、いくつかのより多くの属性を追加する必要がC#で、その後のObjectIDタイプの場合:

[BsonId] 
[BsonRepresentation(BsonType.ObjectId)] 
[BsonElement("Id")] 
public string Subject { get; set; } 
0

私はダンの答えに同意するが、いくつかのケースでは、あなたは、「ID」プロパティを変更することが許可されていない場合別のものには、以下のようなクラスマップの動作を明示的に変更することができます。

  BsonClassMap.RegisterClassMap<Inner>(cm => 
      { 
       cm.AutoMap(); 
       cm.UnmapProperty(c => c.Id); 
       cm.MapMember(c => c.Id) 
        .SetElementName() 
        .SetOrder(0) //specific to your needs 
        .SetIsRequired(true); // again specific to your needs 
      }); 
関連する問題