Fluent Api и Web Api

205
20 января 2020, 09:10

Я новичок в Entity Framework и Fluent Api. Я создал несколько моделей, создал базу данных. Я не уверен, но я думаю, что настроил Fluent Api. В базе пока данные остутсвуют. Проблема вот в чем. Когда я ввожу в браузер контроллер для Web Api появляется ошибка: например: ...../api/AirportAPI.

the 'objectcontent 1' type failed to serialize the response body for content type '**application/xml**

Когда я настроил в Global.asax, то ошибка не изменилось:

the 'objectcontent 1' type failed to serialize the response body for content type 'application/json

Кстати, это тестовое задание месяц назад я задавал вопрос

Когда добавил данные в базу тоже ничего не поменялось. Можете помочь где я допустил ошибку.

Airport.cs

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Web;
            namespace WebServiceForAirport.Models
            {
                public class Airport
                {
                    public int ID { get; set; }
                    public string Country { get; set; }
                    public string City { get; set; }
                    public string NameAirport { get; set; }
                    public string Airline { get; set; }
                    public string CodeAirport { get; set; }
                    public bool Active { get; set; }
                    public virtual Information information { get; set; }
                    public virtual ICollection<Departure_Arrival> DepArrList { get; set; }
                    public virtual ICollection<PitStop> PitStopList { get; set; }
                    public Airport()
                    {
                        DepArrList = new List<Departure_Arrival>();
                        PitStopList = new List<PitStop>();
                    }
                }
            }

Departure-Arrival.cs

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Web;
            namespace WebServiceForAirport.Models
            {
                public class Departure_Arrival
                {
                    public int ID { get; set; }
                    public string Departure { get; set; }
                    public string Arrival { get; set; }
                    public int? AirID { get; set; }
                    public virtual Airport airport { get; set; }
                }
            }

Information.cs

        using System;
        using System.Collections.Generic;
        using System.ComponentModel.DataAnnotations;
        using System.ComponentModel.DataAnnotations.Schema;
        using System.Linq;
        using System.Web;
        namespace WebServiceForAirport.Models
        {
            /// <summary>
            /// 
            /// </summary>
            public class Information
            {
                public int ID { get; set; }
                public string NumberFlight { get; set; }
                public string NumberBoard { get; set; }
                public virtual Airport airport { get; set; }
            }
        }

PitStop.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    namespace WebServiceForAirport.Models
    {
        /// <summary>
        /// 
        /// </summary>
        public class PitStop
        {
            public int ID { get; set; }
            public string PitStopCity { get; set; }
            public DateTime PitStopTime { get; set; }
            public int? AirID { get; set; }
            public virtual Airport airport { get; set; }
        }
    }

AirportDBContext.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;

    namespace WebServiceForAirport.Models
    {
        public class AirDBContext:DbContext
        {
            public DbSet<Airport> Airports { get; set; }
            public DbSet<Departure_Arrival> Departires_Arrivals { get; set; }
            public DbSet<PitStop> PitStops { get; set; }
            public DbSet<Information> Informations { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //Primary Key for Airport
                modelBuilder.Entity<Airport>()
                    .HasKey(a => a.ID);
                //Primary Key for Departure-Arrival
                modelBuilder.Entity<Departure_Arrival>()
                    .HasKey(da => da.ID);
                //Primary Key for PitStop
                modelBuilder.Entity<PitStop>()
                    .HasKey(p => p.ID);
                //Primary Key for Information
                modelBuilder.Entity<Information>()
                    .HasKey(i => i.ID);

                //one-to-one Airport - Information
                modelBuilder.Entity<Airport>()
                    .HasRequired(a=>a.information)
                    .WithRequiredPrincipal(a=>a.airport);
                //one-to-many Airport - Departure-Arrival
                modelBuilder.Entity<Airport>()
                    .HasMany(a => a.DepArrList)
                    .WithRequired(da => da.airport);
                //one-to-many Airport - PitStop
                modelBuilder.Entity<Airport>()
                    .HasMany(a => a.PitStopList)
                    .WithRequired(pi => pi.airport);
                base.OnModelCreating(modelBuilder);
            }
        }
    }

Global.asax.cs

    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
                .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
        }
    }

Web.Config

  <connectionStrings>
    <add name="AirDBContext" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename='|DataDirectory|\AirportDataBase.mdf';Integrated Security=True"
 providerName="System.Data.SqlClient"/>
  </connectionStrings>

AirportAPIController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebServiceForAirport.Models;
using System.Data.Entity;
namespace WebServiceForAirport.Controllers
{
    public class AirportAPIController : ApiController
    {
        AirDBContext db;
        public AirportAPIController()
        {
            db = new AirDBContext();
        }
        public IEnumerable<Airport> GetAll()
        {
            return db.Airports;
        }
    }
}
Answer 1

Измените конструктор AirportAPIController следующим образом:

    public AirportAPIController()
    {
        db = new AirDBContext();
        db.Configuration.ProxyCreationEnabled = false;
    }

А лучше сделайте отдельную модель для возвращаемых данных, как рекомендовал tym32167. Дело в том, что когда вы получаете данные из Entity Framework, на самом деле вы получаете не свои оригинальные классы, а автоматически сгенерированные прокси. Эти прокси EF использует для отслеживания изменений в модели и реализации алгоритма Lazy Load и они очень плохо или совсем не сериализуются. db.Configuration.ProxyCreationEnabled = false; - выключит генерацию этих прокси.

READ ALSO
C# Получение данных из mssql по полю datatable

C# Получение данных из mssql по полю datatable

Всем привет! Ситуация следующая

147
Как получить список шаблонов процесса в TFS?

Как получить список шаблонов процесса в TFS?

Мне нужно получить список шаблонов процесса в TFS, чтобы в дальнейшем создавать свои шаблоны процессовКак получить этот интерфейс?

179
Вывод ответов из базы данных теста

Вывод ответов из базы данных теста

Организовала вывод вопросов из базы данных, но не могу правильно написать запрос или функцию, чтобы ответы по айди вопроса подцеплялись к немуСейчас...

142
Как получить данные из XML

Как получить данные из XML

как получить данные тега по определённому атрибуту(id) допустим данные 54 атрибутаhttp://joxi

150