C# MongoDB C驱动程序引发LINQ异常
我正在构建一个使用Mongo和官方C驱动程序的应用程序。我在使用接口和泛型类型约束时遇到了一个奇怪的问题。考虑以下事项:C# MongoDB C驱动程序引发LINQ异常,c#,mongodb,fluent-mongo,C#,Mongodb,Fluent Mongo,我正在构建一个使用Mongo和官方C驱动程序的应用程序。我在使用接口和泛型类型约束时遇到了一个奇怪的问题。考虑以下事项: interface IMongoObject { BsonObjectId Id { get; set; } string Name { get; set; } } class MongoObject : IMongoObject { public BsonObjectId Id { get; set; } public string Nam
interface IMongoObject
{
BsonObjectId Id { get; set; }
string Name { get; set; }
}
class MongoObject : IMongoObject
{
public BsonObjectId Id { get; set; }
public string Name { get; set; }
}
class Program
{
MongoServer m_db;
string m_dbName;
protected void Save<T>(T entity) where T : IMongoObject
{
GetDatabase().GetCollection<T>(typeof(T).Name).Save(entity);
}
protected T Get<T>(string name) where T : IMongoObject
{
Type t = typeof(T);
// Throws
return GetDatabase().GetCollection<T>(typeof(T).Name).AsQueryable().Where(o => o.Name == name).FirstOrDefault();
}
protected MongoDatabase GetDatabase()
{
if (m_db == null)
{
var conString = "mongodb://localhost/MongoTest";
MongoUrl url = new MongoUrl(conString);
m_dbName = url.DatabaseName;
m_db = MongoServer.Create(url);
}
return m_db.GetDatabase(m_dbName);
}
void Run()
{
MongoObject o = new MongoObject();
o.Name = "Foo";
Save(o);
MongoObject b = Get<MongoObject>("Foo");
Console.ReadKey();
}
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
}
一切都很好,除了打电话给。。。。使用Official驱动程序,我从调用var memberSerializationInfo=containingSerializationInfo.Serializer.GetMemberSerializationInfomemberName得到一个空引用异常;在函数private BsonSerializationInfo GetSerializationInfoMemberIBsonSerializer serializer中,选择SelectQuery.cs中的MemberExpression MemberExpression
如果我将FluentMongo用于LINQ,我会收到一条消息说
鉴别器只能为类注册,不能为接口MyLib.Services.IRepoData注册
这和这家伙基本上是一样的:
我知道Mongo司机在抱怨,因为他不知道IMongoObject是什么。我不明白的是,where调用中的表达式为什么将o视为imongobject类型,而不是MongoObject类型,并通过调试器确认了这是正在发生的事情,就是这样
如果我改用抽象基类,一切都很好。我不知道该怎么做,因为不是所有的MongoObject
感谢因此,问题实际上在于C编译器如何为对象组合表达式树。由于您的类型约束,在访问Name属性时,它将MongoObject强制转换为IMongObject。因此,imongobject是表达式的类型,我们在imongobject上找不到任何成员。我将在下一个版本的驱动程序中看看我们是否可以为这种情况做些什么,但现在,我将坚持使用抽象类 另一方面,最好不要将域对象与DTO混合使用。取而代之的是,有2个,每个职责对应一个,并在它们之间映射 -更新-
有趣的音符。显然,这是基于一个与VB.NET创建表达式树不同于c的不同问题而解决的。因此,在不久的将来,这将正常工作。您可以在这里看到证明这一点的测试:。非常感谢您的回复。奇怪的是,当编译器清楚地知道T的实际类型并且T实现了IMongoObject时,它感觉需要转换为IMongoObject。出于兴趣,我尝试将显式转换添加到T的表达式中,并将其转换为MongoObjectMongoObjecto.Name。有用的o。WRT关注点分离,上面的代码只是演示问题的一个示例-实际代码如您所建议的有2个对象树。我会密切关注版本的修复。谢谢