【发布时间】:2021-02-09 18:05:44
【问题描述】:
当我尝试获取刚插入的文档时,我的 Rider IDE 中止了单元测试。我怀疑它与字符串 ID 到 ObjectId 的序列化有关。插入或替换文档没有问题,但它只是在使用 Find() 操作时中止。 这是 mongo 上下文:
public class MongoContext : IMongoContext
{
private IMongoDatabase Database { get; set; }
public MongoClient MongoClient { get; set; }
private readonly List<Func<Task>> _commands;
public IClientSessionHandle Session { get; set; }
public MongoContext(string connectionString, string database)
{
//BsonDefaults.GuidRepresentation = GuidRepresentation.CSharpLegacy;
_commands = new List<Func<Task>>();
RegisterConventions();
MongoClient = new MongoClient(connectionString);
Database = MongoClient.GetDatabase(database);
}
private void RegisterConventions()
{
var pack = new ConventionPack
{
new IgnoreExtraElementsConvention(true),
new IgnoreIfDefaultConvention(false)
};
ConventionRegistry.Register("My Solution Conventions", pack, t => true);
}
这是基础实体类:
[Serializable]
public class MongoEntity
{
[BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
[BsonRepresentation(BsonType.ObjectId)]
[BsonIgnoreIfDefault]
public string Id { get; set; }
}
这是继承的类:
[Serializable]
public class HashKmerOrganism:MongoEntity
{
public HashKmerOrganism()
{
Organisms = new List<string>();
}
public HashKmerOrganism(int hash,string kmer):this()
{
Hash = hash;
Kmer = kmer;
}
public HashKmerOrganism(int hash, string kmer, IEnumerable<string> organisms) : this(hash, kmer)
{
Organisms = organisms.ToList();
}
public HashKmerOrganism(int hash, string kmer, string organism) : this(hash, kmer, new[] { organism }) { }
public int Hash { get; set; }
public string Kmer { get; set; }
public IEnumerable<string> Organisms { get; set; }
public bool IsKmerReversed { get; set; }
public double TmApprox { get; set; }
public int OrganismCount { get => Organisms.Count(); set => OrganismCount = value; }
}
这些是使用的存储库方法:
public async Task Upsert(HashKmerOrganism hashKmerOrganism)
{
var filterList = new List<FilterDefinition<HashKmerOrganism>>();
var filterBuilder = Builders<HashKmerOrganism>.Filter;
filterList.Add(filterBuilder.Eq(x => x.Hash, hashKmerOrganism.Hash));
filterList.Add(filterBuilder.Eq(x => x.Kmer, hashKmerOrganism.Kmer));
var res = await DbSet.ReplaceOneAsync(filterBuilder.And(filterList), hashKmerOrganism, new ReplaceOptions { IsUpsert = true });
}
public async Task<HashKmerOrganism> GetByKmer(string kmer) => await DbSet.Find(Builders<HashKmerOrganism>.Filter.Eq(x=>x.Kmer,kmer))
.SingleAsync();
这是刚刚中止的单元测试:
[TestClass()]
public class HashKmerRepositoryTests
{
IHashKmerRepository HashKmerRepo;
private IMongoContext Context;
[TestInitialize()]
public void Setup()
{
var connectionString = "mongodb://localhost:27017";
var databaseName = "Organism";
Context= new MongoContext(connectionString, databaseName);
HashKmerRepo = new HashKmerRepository(Context);
}
[TestMethod()]
public async Task UpsertTest()
{
var document = new HashKmerOrganism(1, "kmerstring1", "org1");
var kmer = document.Kmer;
var documentToReplace = new HashKmerOrganism(1, "kmerstring1", new List<string> { "org1", "org2" });
await HashKmerRepo.Remove(document);
await HashKmerRepo.Upsert(document);
await HashKmerRepo.Upsert(documentToReplace);
var actualDoc = await HashKmerRepo.GetByKmer(kmer);
Assert.AreEqual(documentToReplace.Organisms, actualDoc.Organisms);
}
当我运行单元测试时,我没有收到任何错误消息。它只是中止,这些是日志:
--- EXCEPTION #1/2 [InvalidOperationException]
Message = “Process was not started by this object, so requested information cannot be determined.”
ExceptionPath = Root.InnerException
ClassName = System.InvalidOperationException
HResult = COR_E_INVALIDOPERATION=80131509
Source = System.Diagnostics.Process
StackTraceString = “
at System.Diagnostics.Process.EnsureState(State state)
at JetBrains.ReSharper.UnitTestFramework.Processes.PreparedProcessFromRunningProcess.WaitForExitAndSignal()
”
--- Outer ---
--- EXCEPTION #2/2 [LoggerException]
Message = “Process was not started by this object, so requested information cannot be determined.”
ExceptionPath = Root
ClassName = JetBrains.Util.LoggerException
InnerException = “Exception #1 at Root.InnerException”
HResult = COR_E_APPLICATION=80131600
StackTraceString = “
at JetBrains.Util.ILoggerEx.LogException(ILogger this, LoggingLevel level, Exception exception, ExceptionOrigin exceptionOrigin, String comment)
at JetBrains.Util.ILoggerEx.Verbose(ILogger this, Exception exception, ExceptionOrigin origin, String comment)
at JetBrains.Util.ILoggerEx.LogExceptionSilently(ILogger thіs, Exception ex)
at JetBrains.ReSharper.UnitTestFramework.Processes.PreparedProcessFromRunningProcess.WaitForExitAndSignal()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
”
这是我的调试控制台输出:
/Applications/Rider.app/Contents/lib/ReSharperHost/macos-x64/dotnet/dotnet exec /Applications/Rider.app/Contents/lib/ReSharperHost/JetBrains.Debugger.Worker.exe --mode=client --frontend-port=57544 --plugins=/Applications/Rider.app/Contents/plugins/rider-unity/dotnetDebuggerWorker
Stack overflow.
任何帮助将不胜感激!
【问题讨论】:
标签: c# mongodb serialization bson