为什么在获取.net中的mongo文档时会出错?

问题描述 投票:1回答:1

我已将文档插入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类的ProductDetailList属性。ProductDetail:未知区分值“ ProductDetail”。]

我在做什么错?

c# .net mongodb mongodb-.net-driver
1个回答
0
投票

您收到此错误的原因是MongoDB .NET驱动程序不知道如何解析IProductDetail,并且它试图实例化ProductDetail类,因为在MongoDB中存储了表示该类型的_t字段。

通常,您可以在BsonKnownTypes类型中使用polymorphic scenario,但它仅适用于类和结构。因此,如果要在此处保留某些类层次结构,则需要引入一个抽象类,并在此应用此属性。

[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文档反序列化为适当的子类。

© www.soinside.com 2019 - 2024. All rights reserved.