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