2016-11-26 74 views
0

我是MongoDb的新手,并使用一个简单的类并将具有此结构的两条记录插入到数据库中。当我删除实体类属性时,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类中删除Property1,并再次运行读取的代码,我会碰到这样的错误:

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的情况下该怎么做。

感谢

回答

2

在MongoDb文档中稍微浏览一下后,发现一个属性'[BsonIgnoreExtraElements]'对我有用。

[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} }}"; 
    } 
} 

官方的解释是这样的:

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

你说得对。我的观点是必须有一种自动的方式来为我做这件事。我不应该担心同步课程和数据库。 – ach