Почему я получаю сообщение об ошибке при получении документа mon go в. net? - PullRequest
1 голос
/ 25 марта 2020

Я вставил документ в коллекцию в 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: 'Произошла ошибка при десериализации свойства ProductDetailList класса Entities.ProductDetail: неизвестное значение дискриминатора' ProductDetail '.'

Что я делаю неправильно?

1 Ответ

0 голосов
/ 25 марта 2020

Причина, по которой вы получаете эту ошибку, заключается в том, что MongoDB. NET драйвер не знает, как разрешить IProductDetail, и пытается создать экземпляр класса ProductDetail, поскольку существует поле _t, представляющее этот тип. хранится в MongoDB.

Обычно вы можете использовать BsonKnownTypes в сценарии polymorphi c , но он работает только для классов и структур. Поэтому, если вы хотите сохранить здесь некоторую иерархию классов, вам нужно ввести абстрактный класс и применить этот атрибут там.

[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 в соответствующий дочерний класс во время выполнения.

...