在DbSet中使用Include时,C#Entity Framework返回损坏的JSon

时间:2018-02-05 01:09:34

标签: c# json entity-framework-core

我试图使用Entity Framework Core在C#中创建一个简单的一对多关系,该问题类似于循环引用问题,但没有抛出任何异常。

我的模型类是:

[Table("Restaurantes")]
public class Restaurante
{
    public int Id { get; set; }
    public string Descricao { get; set; }
    public List<Prato> Pratos { get; set; }
}

[Table("Pratos")]
public class Prato
{
    public int Id { get; set; }
    public string Descricao { get; set; }
    public decimal Preco { get; set; }

    [ForeignKey("RestauranteForeignKey")]
    public Restaurante Restaurante { get; set; }

}
// One Prato (Dish) belongs to One Restaurant and one Restaurant can have many Dishes (Pratos)

我从DB返回Pratos,我希望它也可以返回各自的餐厅:

context.Pratos.Include(r => r.Restaurante).ToList();

上下文定义:

public class Contexto : DbContext
{
    public DbSet<Restaurante> Restaurantes { get; set; }
    public DbSet<Prato> Pratos { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Prato>()
            .HasOne(p => p.Restaurante)
            .WithMany(r => r.Pratos)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

但是在浏览器上,返回的JSON类似于:

[ {"id":1,"descricao":"prato 1","preco":1.50,"restaurante":{"id":1,"descricao":"fulano","pratos":[

它返回的不多于此。我也试过documentation,但在这个问题方面没有帮助。提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果您使用的是Json.net,则可能需要更改DefaultSettings以处理序列化

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.All,
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize
};

或取决于您的特定要求

PreserveReferencesHandling

  
      
  • :序列化类型时不要保留引用。
  •   
  • 对象:在序列化为JSON对象结构时保留引用。
  •   
  • 数组:在序列化为JSON数组结构时保留引用。
  •   
  • 全部:序列化时保留引用。
  •   

ReferenceLoopHandling

  
      
  • 错误:遇到循环时抛出JsonSerializationException。
  •   
  • 忽略:忽略循环引用,不进行序列化。
  •   
  • 序列化:序列化循环引用。
  •