C# 无法确定i=>;的序列化信息;i、 使用接口的Id

C# 无法确定i=>;的序列化信息;i、 使用接口的Id,c#,mongodb,mongodb-query,C#,Mongodb,Mongodb Query,首先,我知道这个错误消息已经有问题了,但是我还没有发现任何与使用这种类型的查询接口有关的问题 我目前正在尝试使用C#Driver 2.0更新MongoDB实体。但是,当它试图构建查询时(我假设它是Builders.Filter.Eq(I=>I.Id,entity.Id)代码位),我得到了一个错误,我得到了以下错误: 无法确定i=>i.Id的序列化信息 我有下面的类,我正在尝试更新 公共接口的可扩展性{ 字符串Id{get;set;} } 公共接口ITrack:Entity{ 字符串名称{get;

首先,我知道这个错误消息已经有问题了,但是我还没有发现任何与使用这种类型的查询接口有关的问题

我目前正在尝试使用C#Driver 2.0更新MongoDB实体。但是,当它试图构建查询时(我假设它是
Builders.Filter.Eq(I=>I.Id,entity.Id)
代码位),我得到了一个错误,我得到了以下错误:

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

我有下面的类,我正在尝试更新

公共接口的可扩展性{
字符串Id{get;set;}
}
公共接口ITrack:Entity{
字符串名称{get;set;}
}
公共类TrackDTO:ITrack
{
[BsonId]
公共字符串Id{get;set;}
公共字符串名称{get;set;}
}
然后,我使用接口将对象保存到数据库中,并在通用DAO类中使用以下方法替换整个文档。注意,在下面的示例中,T被编码为
ITrack
(即
TrackDao=newdao
),但当对象在运行时传入时,它是
TrackDTO
对象(这是正确的):

公共异步任务保存(T实体)
{
//将实体保存到集合中。
ReplaceOneResult result=wait _collection.ReplaceOneAsync(Builders.Filter.Eq(i=>i.Id,entity.Id),entity,new UpdateOptions(){isupert=true});
//返回保存的用户对象。
返回实体;
}
我不知道我的
IEntity
类的Id属性是否也需要
[BsonId]
属性,但如果可能的话,我想避免这种情况,因为我想保持我的模型层(在
IEntity
所在的位置)没有任何特定于数据库平台的引用

我还尝试添加以下类映射,但也没有效果:

BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.MapMember(c=>c.Id).SetSerializer(新的StringSerializer(BsonType.ObjectId));
cm.SetIdMember(cm.GetMemberMap(c=>c.Id));
});
出于与模型层中没有
[BsonId]
属性相同的原因,我不希望模型类被引用DTO对象的
[BsonKnownTypes]
修饰,但是我不介意这是否需要作为类映射的一部分发生

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

    尝试使用:
    nameof()

    在我的例子中,为用于构建UQ的字符串列添加“[BsonRepresentation(BsonType.String)]”解决了这个问题。
    Builders<T>.Filter.Eq(nameof(IEntity.Id), entity.Id)
    
    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; }
    }