MongoDB C#2.1 ReplaceOneAsync不适用于存储库模式

本文关键字:存储 模式 适用于 不适用 C#2 ReplaceOneAsync MongoDB | 更新日期: 2023-09-27 18:21:16

我正在尝试为mongodb实现异步存储库模式。这是我的代码:

public class EntityBase
{
    [BsonId]
    public ObjectId Id { get; set; }
}
public class User : EntityBase
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
public class MongoDbRepository<T> where T : EntityBase
{
    private IMongoDatabase _database;
    private IMongoCollection<T> _collection;
    public MongoDbRepository()
    {
        GetDatabase();
        GetCollection();
    }
    private void GetDatabase()
    {
        var client = new MongoClient("mongodb://localhost/");
        _database = client.GetDatabase("LocalTest");
    }
    private void GetCollection()
    {
        _collection = _database.GetCollection<T>(typeof(T).Name);
    }
    public async Task<ReplaceOneResult> Save(T doc)
    {
        return await _collection.ReplaceOneAsync(w => w.Id == doc.Id, doc, new UpdateOptions { IsUpsert = true });
    }
}

控制台应用程序,它只是调用逻辑:

class Program
{
    static void Main(string[] args)
    {
        var userRepo = new MongoDbRepository<User>();
        userRepo.Save(new User
        {
            FirstName = "fn",
            LastName = "ln"
        }).Wait();
        Console.ReadKey();
    }
}

在这行代码中:

return await _collection.ReplaceOneAsync(w => w.Id == doc.Id, doc, new UpdateOptions { IsUpsert = true });

我收到一个错误:

转换([文档])。不支持Id。

如果我像这样更改代码,它是有效的:

private IMongoCollection<EntityBase> _collection;
    private void GetCollection()
    {
        _collection = _database.GetCollection<EntityBase>(typeof(EntityBase).Name);
    }

但我真的需要使用T而不是BaseMongoClass。。。你知道为什么会出现这个错误吗?我该如何修复它?非常感谢!

MongoDB C#2.1 ReplaceOneAsync不适用于存储库模式

刚刚解决了同样的问题。去掉==,由于某种原因,新的mongo驱动程序不喜欢它。我使用了.Equals()

更改

return await _collection.ReplaceOneAsync(w => w.Id == doc.Id, 
    doc, new UpdateOptions { IsUpsert = true });

return await _collection.ReplaceOneAsync(w => w.Id.Equals(doc.Id), 
    doc, new UpdateOptions { IsUpsert = true });

如果你使用接口也会发现这个问题,

解决方案而不是id使用_id

 var filter = Builders<IVideo>.Filter.Eq("_id", doc.Id);
 await _collection.ReplaceOneAsync(filter , doc, new UpdateOptions { IsUpsert = true });

使用MongoDB驱动程序2.4.4,在过滤器上使用"Equal"比较(不知道"_id"):

var filter = Builders<T>.Filter.Eq(c => c.Id, doc.Id);
await collection.ReplaceOneAsync(filter, doc, new UpdateOptions { IsUpsert = true });