[英]Invalid operation exception when fetching document mongodb c#
當我嘗試獲取剛剛插入的文檔時,我的 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.
任何幫助,將不勝感激!!
問題出在 HashKmerOrganism 對象的 setter 中。 它導致了一些未被捕獲的遞歸操作:
public int OrganismCount { get => Organisms.Count(); set => OrganismCount = value; }
被替換了
[BsonElement]
public int OrganismCount {get => Organisms.Count();}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.