Ignoring Extra Elements in mongoDB C# Driver

5230 ワード

MongoDBフィールドを削除するとエラーが表示されます:Element...does not match any field or property of class Customer.
エンティティクラスに[BsonIgnoreExtraElements]//using MongoDBを追加する必要がある.Bson.Serialization.Attributes;
この外国人の文章を参考にしてください.
mongoDB  affords you the ability to store documents within a single collection that can each have their own schema. This is a drastic change if you have a background in relational databases. In a relational database, you have a static schema per table and you cannot deviate from without changing the structure of the table.
In the example below, I have defined a  Person  class and a  PersonWithBirthDate  class which derives from the  Person  class. These can both be stored in the same collection in a  mongoDB  database. In this case, assume the documents are stored in the  Persons  collection.
public class Person

{

    public string FirstName { get; set; }

    public string LastName { get; set; }

}



public class PersonWithBirthDate : Person

{

    public DateTime DateOfBirth { get; set; }

}

You can easily retrieve and of the documents and have the  mongoDB C# Driver  deserialze the document into the  PersonWithBirthDate  class. However, you will run into issues if you query the  Persons  collection and try to have the driver deserialize the data into the  Person  class. You will receive an error that there are elements that cannot be deserialized.
This easily fixable by adding the  [BsonIgnoreExtraElements]  attribute to the  Person  class. You can see the modified class below. This will instruct the driver to ignore any elements that it cannot deserialize into a corresponding property. With the attribute any document in the  Persons  collection can be deserailized to the Person  class without error.
[BsonIgnoreExtraElements]

public class Person

{

    public string FirstName { get; set; }

    public string LastName { get; set; }

}



public class PersonWithBirthDate : Person

{

    public DateTime DateOfBirth { get; set; }

}

 
There is a gotcha that I recently found while trying to implement a scenario similar to the one above. In the source code for the  mongo C# driver , the attribute is defined in a way that it can be inherited to the child classes when applied to the parent class ( BsonIgnoreExtraElementsAttribute.cs ). However, when the attribute is read, it ignores the inheritance of the attribute ( BsonClassMap.cs ) and does not get applied to the child classes. I agree with this implementation, but it’s a little confusing if you review the source code for the definition of the [BsonIgnoreExtraElements]  attribute. Even with this inconsistency, all you need to do is to apply the [BsonIgnoreExtraElements]  to each class that may read a document from a collection where there are extra elements.