我正在使用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
)。
答案 0 :(得分:0)
创建一个小的测试项目后,我发现[BsonIgnore]
可以完全满足我的期望:
InvalidOperationException:{document}。不支持IsOwner。
经过一番挖掘,我发现问题是由我们对会员的无视引起的。为了不必在我们的域层中引用Mongo,我们引入了与Mongo的内置属性相同的自定义属性。但是,我们的实现并未正确忽略成员,而是对其禁用了序列化:
if (mm.MemberInfo.IsDefined(typeof(CustomIgnoreMappingAttribute), true))
{
- memberMap.SetShouldSerializeMethod(o => false);
+ classMap.UnmapMember(memberMap.MemberInfo);
}