2016-11-26 10 views
0

MongoDbを初めて使用し、単純なクラスを使用してこの構造を持つ2つのレコードをデータベースに挿入しました。エンティティクラスプロパティを削除すると、MongoDb.Driver例外がスローされます

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Property1 { get; set; } 

    public override string ToString() 
    { 
     return $"{{ Id: {Id}, Name: {Name} }}"; 
    } 
} 

私はこのコードでそれらを読むことができます。

var client = new MongoClient(); 
var db = client.GetDatabase("test-update"); 
var people = db.GetCollection<Person>("people").Find(p => true).ToList(); 

foreach (var person in people) 
{ 
    Console.WriteLine(person.ToString()); 
} 

結果は次のとおりです。

{ Id: 1, Name: person 1 } 
{ Id: 2, Name: person 2 } 

今、私は私のPersonクラスからプロパティ1を削除し、再度読み取ったコードを実行する場合、私はこのエラーに遭遇します:

Unhandled Exception: System.FormatException: Element 'Property1' does not match any field or property of class Person. 
    at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context) 
    at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
    at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context) 
    at MongoDB.Driver.Core.Operations.CursorBatchDeserializationHelper.DeserializeBatch[TDocument](RawBsonArray batch, IBsonSerializer`1 documentSerializer, MessageEncoderSettings messageEncoderSet 
tings) 
    at MongoDB.Driver.Core.Operations.FindCommandOperation`1.CreateCursorBatch(BsonDocument result) 
    at MongoDB.Driver.Core.Operations.FindCommandOperation`1.ExecuteCommand(IReadBinding binding, ServerDescription serverDescription, CancellationToken cancellationToken) 
    at MongoDB.Driver.Core.Operations.FindCommandOperation`1.Execute(IReadBinding binding, CancellationToken cancellationToken) 
    at MongoDB.Driver.Core.Operations.FindOperation`1.Execute(IReadBinding binding, CancellationToken cancellationToken) 
    at MongoDB.Driver.OperationExecutor.ExecuteReadOperation[TResult](IReadBinding binding, IReadOperation`1 operation, CancellationToken cancellationToken) 
    at MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperation[TResult](IReadOperation`1 operation, ReadPreference readPreference, CancellationToken cancellationToken) 
    at MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperation[TResult](IReadOperation`1 operation, CancellationToken cancellationToken) 
    at MongoDB.Driver.MongoCollectionImpl`1.FindSync[TProjection](FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken) 
    at MongoDB.Driver.FindFluent`2.ToCursor(CancellationToken cancellationToken) 
    at MongoDB.Driver.IAsyncCursorSourceExtensions.ToList[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken) 
    at ConsoleApplication.Program.Main(String[] args) in C:\Users\choro\Desktop\mongo-update\Program.cs:line 12 

これは単なるテストプロジェクトであり、これらのメタデータの変更は実際のプロジェクトで常に発生します。これらの変更を管理してエラーを回避するにはどうすればよいですか? EFおよびSQL Serverでは

私は常に自動移行を使用し、メタデータの変更を考える必要はありませんでした。しかし、私はMongoDbの場合にどうするべきか分かりません。 Mongoのは、あなたのモデルに文書をデシリアライズすることはできません。原因モデルからプロパティを除去することにより

おかげ

答えて

2

はMongoDBのドキュメントで少しブラウジングした後、私のために働いた属性「[BsonIgnoreExtraElements]」になっています。あなたは正しい

When a BSON document is deserialized, the name of each element is used to look up a matching member in the class map. Normally, if no matching member is found, an exception will be thrown. If you want to ignore extra elements during deserialization, use a BsonIgnoreExtraElementsAttribute

0

は、あなたのモデルとデータベースの文書は、同期ではありません。 mongoドキュメントからProperty1も削除する必要があります。

+0

[BsonIgnoreExtraElements] public class Person { public int Id { get; set; } public string Name { get; set; } //public string Property1 { get; set; } public override string ToString() { return $"{{ Id: {Id}, Name: {Name} }}"; } } 

公式説明はこれです。私の主張は、私のためにそれを自動的に行う方法です。私は、クラスとデータベースを一緒に同期させることについて心配すべきではありません。 – ach

関連する問題