使用C# .NET Core向MongoDB插入对象失败求助
解决.NET Core向MongoDB插入数据时的CallContext加载错误
这个问题我之前帮同事排查过,根源很明确:你用的MongoDB .NET驱动版本和.NET Core环境不兼容。System.Runtime.Remoting.Messaging.CallContext是仅属于.NET Framework的API,在.NET Core/.NET 5+里已经被移除了,旧版驱动会尝试调用这个不存在的类型,自然就抛出了加载错误。
下面是具体的解决步骤和代码优化建议:
1. 升级MongoDB驱动到兼容.NET Core的版本
首先要确保你安装的是支持.NET Core的MongoDB驱动版本(建议2.10及以上,最新稳定版更好)。你可以通过NuGet包管理器操作,或者用.NET CLI命令:
# 先卸载旧版(如果已安装) dotnet remove package MongoDB.Driver # 安装最新稳定版 dotnet add package MongoDB.Driver
注意:要保证MongoDB.Driver、MongoDB.Bson、MongoDB.Driver.Core这三个包的版本一致,避免版本冲突。
2. 优化你的代码(可选但推荐)
你的代码逻辑本身没问题,但有几个可以优化的点,能让它更符合.NET Core的最佳实践:
修正数据库连接类(单例化MongoClient)
MongoClient是线程安全的,重复创建实例会浪费资源,改成单例模式更高效:
public class DatabaseConnection { // 静态单例实例,仅初始化一次 private static readonly IMongoClient _mongoClient; private static readonly IMongoDatabase _database; static DatabaseConnection() { string connectionString = "mongodb://localhost:27017"; _mongoClient = new MongoClient(connectionString); _database = _mongoClient.GetDatabase("FlourishDB"); } public IMongoDatabase GetDatabase() { return _database; } }
优化扩展方法(避免强制类型转换)
原来的扩展方法用Object作为参数,强制转换有类型安全风险,改成直接针对Company类型更稳妥:
public static class DatabaseExtensions { public static void AddIntoDatabase(this Company company) { try { IMongoCollection<Company> companyCollection = new DatabaseConnection().GetDatabase().GetCollection<Company>("Company"); companyCollection.InsertOne(company); } catch(Exception e) { // 打印完整错误信息,方便后续排查 Console.WriteLine($"插入失败:{e.Message}\n详细堆栈:{e.StackTrace}"); } } }
控制台代码保持不变(或微调)
static void Main(string[] args) { var company = new Company { AccountNumber = "101010" }; company.AddIntoDatabase(); Console.WriteLine("Completed successfully"); Console.ReadLine(); }
最后验证
做完上面的步骤后,重新编译运行你的程序,应该就能正常插入数据到MongoDB了。如果还有问题,可以先检查MongoDB服务是否正常运行,连接字符串是否正确。
内容的提问来源于stack exchange,提问作者Wade Martin
相关产品推荐
相关产品推荐

