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

本文关键字:Id 接口 信息 序列化 gt 无法确定 | 更新日期: 2023-09-27 18:03:38

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

我目前正在尝试使用c# Driver 2.0更新MongoDB实体。然而,我得到一个错误,当它试图建立查询(我假设它是Builders<T>.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<ITrack>),但当对象在运行时传入时,它是TrackDTO对象(这是正确的):

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]属性相同的原因,我不想用引用DTO对象的[BsonKnownTypes]装饰模型类,但是我不介意这是否需要作为类映射的一部分发生。

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

"无法确定i => iid的序列化信息。"

尝试使用: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; }
}