为什么我在.net中检索mongo文档时出错



我在MongoDB 中的集合中插入了一个文档

public class Product :BaseDocument, IProduct
{
public Guid ProductId { get; set; }
public string ProductName { get; set; }
public Guid AccountId { get; set; }
public List<IProductDetail> ProductDetailList { get; set; } = new List<IProductDetail>();
}
public class ProductDetail:IProductDetail
{
public Guid ProductDetailId { get; set; }
public string ProductDetailCode { get; set; }
}

当我试图检索这个时,我得到了一个错误

public List<IProduct> GetProductsList(Guid accountId)
{
IEnumerable<IProduct> prodList = new List<Product>();
IMongoCollection<Product> products = _database.GetCollection<Product>("Products");
prodList = products.Find(m => m.AccountId == accountId).ToList();
return prodList.ToList();
}

错误如下

System.FormatException:'反序列化类Entities.ProductDetail:未知的ProductDetailList属性鉴别器值"ProductDetail">

我做错了什么?

出现此错误的原因是MongoDB.NET驱动程序不知道如何解析IProductDetail,它试图实例化ProductDetail类,因为MongoDB中存储了一个代表该类型的_t字段。

通常您可以在这种多态场景中使用BsonKnownTypes,但它只适用于类和结构。因此,如果你想在这里保留一些类层次结构,那么你需要引入一个抽象类并在那里应用这个属性。

[BsonKnownTypes(typeof(ProductDetail))]
public abstract class ProductDetailBase: IProductDetail
{
}
public class ProductDetail : ProductDetailBase
{
public Guid ProductDetailId { get; set; }
public string ProductDetailCode { get; set; }
}

然后你可以使用:

public List<ProductDetailBase> ProductDetailList { get; set; } = new List<ProductDetailBase>();

在这种情况下,您可以有一个类层次结构,MongoDB.NET驱动程序将在运行时将您的BSON文档反序列化为适当的子类。

最新更新