Как сериализовать класс ef poco с круговой ссылкой с помощью protobuf-net

#c# #entity-framework-core #protobuf-net #inverse-relationship

Вопрос:

Я использую protobuf-сеть Марка Гравелла и ядро ef в своем проекте.

короче говоря, я использую атрибут Inverseproperty в своем классе POCO, который вызывает циклическую ссылку при получении результатов из базы данных, что приводит к тому, что я теряюсь, когда пытаюсь сериализовать данные с помощью protobuf net.

Я в настоящее время сериализую данные с помощью Jsonconvert, устанавливая ReferenceLoopHandling = ReferenceLoopHandling.Ignore и возвращая клиенту строку json, чтобы поддерживать приложение в рабочем состоянии, но не хочу использовать этот метод, так как это не имеет никакого смысла.

Я хотел бы знать, возможно ли либо запретить EF core генерировать циклическую ссылку при использовании атрибута Inverseproperty, либо если protobuf-net имеет функцию обработки ссылок игнорирования при сериализации данных..

упрощенная версия моего класса poco выглядит так:

 [ProtoContract]
[Table("CATEGORIES_M")]
public class CATEGORIES_M
{
    public CATEGORIES_M()
    {
        CATEGORIES_M_COLLECTION = new HashSet<CATEGORIES_M>();
        //Product = new HashSet<Product>();
        CM_DATE = DateTime.Now;
    }

    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [ProtoMember(1)]
    public int CM_ROWID { get; set; }

    [ProtoMember(2)]
    public string CM_NAME { get; set; }

    [ProtoMember(3)]
    public int? CM_PARENT_REFNO { get; set; }

    [ProtoMember(4)]
    [ForeignKey(nameof(CM_PARENT_REFNO))]
    [InverseProperty(nameof(CATEGORIES_M_COLLECTION))]
    public  CATEGORIES_M CATEGORIES_M_PARENT { get; set; }

    [ProtoMember(5)]
    [InverseProperty(nameof(CATEGORIES_M_PARENT))]
    public  ICollection<CATEGORIES_M> CATEGORIES_M_COLLECTION { get; set; }  
}
 

любая помощь будет признательна

Ответ №1:

Protobuf-net не имеет хорошей поддержки для этого сценария. Версия V2 имеет некоторые ограниченные возможности отслеживания ссылок, но они устарели в версии V3, потому что это вызвало больше проблем, чем решило. Мои предложения, как автора библиотеки:

  1. сериализуйте простую древовидную модель и впоследствии постройте из нее свою реальную модель, или
  2. используйте другой инструмент