MongoDB C#驱动程序:查询被忽略的属性时引发异常

时间:2019-03-06 07:03:15

标签: c# mongodb

我正在使用MongoDB C#驱动程序v2.7.x,但我想知道是否有POCO类,在查询未映射的属性时是否总会发出警告。

例如,我有以下课程:

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

    [BsonIgnore]
    public bool IsOwner { get; set; }
}

因此,每当我存储该对象时,IsOwner都不会插入数据库(see also the ignore member docs)中。但是,当我执行GetCollection<GroceryList>(..).AsQueryable().Where(gl => gl.IsOwner)时,它会转换为{$match: {IsOwner: true}},因此该元素仍在查询(see also the MongoDB LINQ docs)中使用。

现在在这个简单的示例中,很容易发现问题;但是,当存在几层间接访问并且函数开始返回IQueryable而不是IEnumerable时,它将变得更加困难。因此,我想防止那些情况下可以查询未映射的任何字段的情况。最好通过某种约定(IMemberMapConvention)。

1 个答案:

答案 0 :(得分:0)

创建一个小的测试项目后,我发现[BsonIgnore]可以完全满足我的期望:

  

InvalidOperationException:{document}。不支持IsOwner。

经过一番挖掘,我发现问题是由我们对会员的无视引起的。为了不必在我们的域层中引用Mongo,我们引入了与Mongo的内置属性相同的自定义属性。但是,我们的实现并未正确忽略成员,而是对其禁用了序列化:

  if (mm.MemberInfo.IsDefined(typeof(CustomIgnoreMappingAttribute), true))
  {
-     memberMap.SetShouldSerializeMethod(o => false);
+     classMap.UnmapMember(memberMap.MemberInfo);
  }