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。。。你知道为什么会出现这个错误吗?我该如何修复它?非常感谢!
刚刚解决了同样的问题。去掉==
,由于某种原因,新的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 });