2

公式の mongo-csharp ドライバーを使用して列挙しようとしている Products というコレクションがあります。ただし、コレクションを列挙しようとすると (たとえば、foreach ループを使用して)、次のエラーが発生します。

「タイプMongoDB.Driver.MongoDBRefのデフォルトコンストラクターが見つかりません」

エンティティクラスは次のようになります

public partial class Product
{
    public BsonObjectId _id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Url { get; set; }
    public int Price { get; set; }
    public string Country { get; set; }
    public MongoDBRef Merchant { get; set; }
}

コレクション内のエントリは次のようになります

{
    "_id" : ObjectId("4cff739fba63c20301ee5bc5"),
    "Name" : "Product Name",
    "Description" : "Product Description",
    "Url" : "http://mysite/products/product-name",
    "Price" : 1200,
    "Country" : "au",
    "Merchant" : {
        "$ref" : "Merchant",
        "$id" : ObjectId("533981033d565e640d000000")
    }
}

そして、私はそれをこのように読んでいます。

var db = Db.Instance.GetDatabase();
var matches = db.GetCollection<Product>("Product").FindAll();

次のいずれかを実行するまで、エラーは発生しません。

var l = matches.ToList();

また

foreach (var p in matches) {
   // Do something
}
4

1 に答える 1

2
  1. mongovueを使用して mongo db に接続し、コレクションとデータが存在することを確認します。
  2. のコードを表示

    var db = Db.Instance.GetDatabase();

次のようになります。

var server = MongoServer.Create("mongodb://localhost:27019");
var db =  server.GetDatabase("database_name");

そしてあなたのコードより:

var matches = db.GetCollection<Product>("Product").FindAll();

3.C# 用の mongo ドライバーのソースを確認したところ、MongoDBRef で次のことがわかりました。

 // default constructor is private and only used for deserialization
    private MongoDBRef() {
    } 

したがって、mongo c# ドライバー チームの mongo ドライバーのバージョンでは、デフォルト コンストラクターを忘れていたことをお勧めします。いずれにせよ、 Reflectorを使用してコンストラクターが存在するかどうかを確認してください。4.そして、コンストラクターがあなたのバージョンのmongoドライバーに存在しないことを99%確信しています。いくつかのmongoコレクションを列挙し始めると、mongoドライバーがデータをdesirealizeし、デフォルトのコンストラクターが見つからない場合にエラーがスローされるためです。

于 2010-12-15T12:33:26.723 に答える