无法使用接口确定i => i.Id的序列化信息

首先,我知道已经存在此错误消息的问题,但我没有发现任何与使用此类查询的接口相关的问题。

我目前正在尝试使用C#Driver 2.0更新MongoDB实体。 但是,我在尝试构建查询时遇到错误(我假设它是Builders.Filter.Eq(i => i.Id, entity.Id)代码)并且我是收到以下错误:

无法确定i => i.Id的序列化信息。

我有以下课程,我正在尝试更新

 public interface IEntity { string Id { get; set; } } public interface ITrack : IEntity { string Name { get; set; } } public class TrackDTO : ITrack { [BsonId] public string Id { get; set; } public string Name { get; set; } } 

然后,我使用接口将对象保存到数据库中,使用通用DAO类中的以下方法来替换整个文档。 注意,在下面的示例中,T被编码为ITrack (即TrackDao = new Dao ),但是当在运行时TrackDTO对象时,它是一个TrackDTO对象(这是正确的):

 public async Task Save(T entity) { // Save the entity to the collection. ReplaceOneResult result = await _collection.ReplaceOneAsync(Builders.Filter.Eq(i => i.Id, entity.Id), entity, new UpdateOptions() { IsUpsert = true }); // return the saved user object. return entity; } 

我不知道我的IEntity类的Id属性IEntity也需要[BsonId]属性,但是如果可能的话我想避免这种情况,因为我想保留我的模型层( IEntity所在的地方)没有任何数据库平台具体参考。

我也尝试添加以下类映射,它也没有任何影响:

 BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Id).SetSerializer(new StringSerializer(BsonType.ObjectId)); cm.SetIdMember(cm.GetMemberMap(c => c.Id)); }); 

出于与Model层中没有[BsonId]属性相同的原因,我不希望用引用DTO对象的[BsonKnownTypes]装饰Model类,但是我不介意这是否需要作为一部分发生类地图。

  1. 对于

“无法确定i => i.Id的序列化信息。”

尝试使用: nameof()

 Builders.Filter.Eq(nameof(IEntity.Id), entity.Id) 

2。

…但是我想尽可能避免这种情况,因为我想保留我的模型层(IEntity所在的位置),不受任何数据库平台特定引用的影响。

我的问题的解决方案,如你和类似的问题:

 public interface IEntity { [BsonId] string Id { get; set; } string IdEntity { get; set; } } [BsonIgnoreExtraElements(Inherited = true)] public abstract class BaseEntity : IEntity { [BsonRepresentation(BsonType.ObjectId)] public virtual string Id { get; set; } [BsonIgnoreIfNull] public string IdEntity { get; set; } }