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

时间:2015-07-21 06:39:40

标签: c# mongodb mongodb-query

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

我目前正在尝试使用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;如果这需要作为班级地图的一部分发生,请注意。

1 个答案:

答案 0 :(得分:3)

  1. For
  2.   

    “无法确定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; }
    }