#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, потому что это вызвало больше проблем, чем решило. Мои предложения, как автора библиотеки:
- сериализуйте простую древовидную модель и впоследствии постройте из нее свою реальную модель, или
- используйте другой инструмент