当尝试将继承与MongoRepository结合使用C#时,我遇到了序列化错误。
真正奇怪的是它可以在很短的时间内工作,但是在说重建或其它失败之后。如果我删除该集合并创建一个新集合,它将一直有效,直到停止或重建。
我的代码如下:
public class Organization
{
// other attributes removed for demonstration simplicity
public List<Person> People { get;set; }
}
public abstract class Person
{
public string Id {get;set;}
public string Name {get;set;}
}
public class Employee : Person
{
public string Badge {get;set;}
}
public class Contractor : Person
{
public string Company {get;set;}
}
当我尝试得到它时:
static MongoRepository<Organization> apps = new MongoRepository<Organization>();
return apps.Single(c => c.Id == id);
我收到的错误是:
MongoDB.Driver.dll中出现“System.IO.FileFormatException”类型的异常,但未在用户代码中处理
其他信息:反序列化API.Models.Organization类的People属性时发生错误:无法创建抽象类的实例。
答案 0 :(得分:14)
添加装饰器属性:
[BsonKnownTypes(typeof(Contractor), typeof(Employee))]
解决了这个问题。
答案 1 :(得分:2)
有一个类似的问题,其中Person
是一个继承自另一个抽象类的抽象类。我不喜欢将Mongo属性放在我的域模型中的想法,在稍微弄清楚它之后,发现将Person
类标记为root使其正确序列化和反序列化:
BsonClassMap.RegisterClassMap<Person>(cm => {
cm.SetIsRootClass(true);
});
请注意,由于MongoDB驱动程序未设置鉴别器_t
字段,因此发生了反序列化异常。