簡體   English   中英

獲取文檔mongodb c#時的無效操作異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM