首先,我知道已经存在此错误消息的问题,但我还没有发现任何与使用此类查询的接口有关的内容。
我目前正在尝试使用C#Driver 2.0更新MongoDB实体。但是,我在尝试构建查询时遇到错误(我假设它是Builders<T>.Filter.Eq(i => i.Id, entity.Id)
位代码)我得到了以下错误:
无法确定i =&gt;的序列化信息。 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<ITrack>
),但是当对象在运行时传入时,它是TrackDTO
对象(这是正确的):< / p>
public async Task<T> Save(T entity)
{
// Save the entity to the collection.
ReplaceOneResult result = await _collection.ReplaceOneAsync(Builders<T>.Filter.Eq(i => i.Id, entity.Id), entity, new UpdateOptions() { IsUpsert = true });
// return the saved user object.
return entity;
}
我不知道我的IEntity
课程的Id属性是否也需要[BsonId]
属性,但我想尽可能避免这种情况,因为我想保留我的模型层(IEntity
所在的位置)没有任何数据库平台特定的引用。
我还尝试添加以下类别地图,该地图也没有效果:
BsonClassMap.RegisterClassMap<TrackDTO>(cm =>
{
cm.AutoMap();
cm.MapMember(c => c.Id).SetSerializer(new StringSerializer(BsonType.ObjectId));
cm.SetIdMember(cm.GetMemberMap(c => c.Id));
});
出于与模型层中没有[BsonId]
属性相同的原因,我不想让用[BsonKnownTypes]
装饰的模型类引用DTO对象,但是我不喜欢&# 39;如果这需要作为班级地图的一部分发生,请注意。
答案 0 :(得分:3)
“无法确定i =&gt; i.Id的序列化信息。”
尝试使用:nameof()
。
Builders<T>.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; }
}