【问题标题】:Invalid operation exception when fetching document mongodb c#获取文档时出现无效操作异常mongodb c#
【发布时间】: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


    【解决方案1】:

    问题出在 HashKmerOrganism 对象的设置器中。它导致了一些未被捕获的递归操作:

    public int OrganismCount { get => Organisms.Count(); set => OrganismCount = value; }
    

    被替换为

    [BsonElement]
    public int OrganismCount {get => Organisms.Count();}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2020-11-10
      • 2010-10-02
      相关资源
      最近更新 更多