Не подтягивать foreign key поля

236
05 июня 2017, 21:30

Пробую переписать Java EE проект в C#. Замапил базу с помощью Entity Framework, создались классы под каждую таблицу. Везде где есть foreign key фреймворк так же подтянул соответствующую сущность, например:

namespace MainProject.Model.Entity
{
    using System;
    using System.Collections.Generic;
    public partial class AcOpTabl
    {
        public Nullable<decimal> WaveLeng { get; set; }
        public string Nzv { get; set; }
        public string Uzv { get; set; }
        public string Nsv { get; set; }
        public string E { get; set; }
        public Nullable<decimal> M1 { get; set; }
        public Nullable<decimal> M2 { get; set; }
        public Nullable<decimal> M3 { get; set; }
        public int ID { get; set; }

        public virtual HeadTabl HeadTabl { get; set; }
        public virtual Bibliogr Bibliogr { get; set; }
    }
}

Пытаюсь получить записи бд из контроллера для этой сущности, но запрос выполняется бесконечно долго. подозреваю, что дело в подтянутых сущностях по внешнему ключу и при сериализации в json попадает в бесконечный цикл...

namespace MainProject.Controller
{
    public class AcOpTablsController : ApiController
    {
        private CrystalEntities db = new CrystalEntities();
        // GET: api/AcOpTabls
        public IQueryable<AcOpTabl> GetAcOpTabl()
        {
            return db.AcOpTabl;
        }
        // GET: api/AcOpTabls/5
        [ResponseType(typeof(AcOpTabl))]
        public IHttpActionResult GetAcOpTabl(int id)
        {
            AcOpTabl acOpTabl = db.AcOpTabl.Find(id);
            if (acOpTabl == null)
            {
                return NotFound();
            }
            return Ok(acOpTabl);
        }
        // PUT: api/AcOpTabls/5
        [ResponseType(typeof(void))]
        public IHttpActionResult PutAcOpTabl(int id, AcOpTabl acOpTabl)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            if (id != acOpTabl.ID)
            {
                return BadRequest();
            }
            db.Entry(acOpTabl).State = EntityState.Modified;
            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!AcOpTablExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return StatusCode(HttpStatusCode.NoContent);
        }
        // POST: api/AcOpTabls
        [ResponseType(typeof(AcOpTabl))]
        public IHttpActionResult PostAcOpTabl(AcOpTabl acOpTabl)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            db.AcOpTabl.Add(acOpTabl);
            db.SaveChanges();
            return CreatedAtRoute("DefaultApi", new { id = acOpTabl.ID }, acOpTabl);
        }
        // DELETE: api/AcOpTabls/5
        [ResponseType(typeof(AcOpTabl))]
        public IHttpActionResult DeleteAcOpTabl(int id)
        {
            AcOpTabl acOpTabl = db.AcOpTabl.Find(id);
            if (acOpTabl == null)
            {
                return NotFound();
            }
            db.AcOpTabl.Remove(acOpTabl);
            db.SaveChanges();
            return Ok(acOpTabl);
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
        private bool AcOpTablExists(int id)
        {
            return db.AcOpTabl.Count(e => e.ID == id) > 0;
        }
    }
}

Если у таблицы нету внешних ключей запрос отрабатывает нормально. Как можно исправить это? В java я мог просто пометить поле класса несериализуемым и все работало как надо, как сделать так же в C#?

EDIT 1

Запрос оказывается тянет все связанные сущности, даже если нету внешнего ключа. Если другая таблица ссылается на значение в запрашиваемой таблице, то почему-то возвращает все ссылающиеся таблицы + значение из текущей.

Answer 1

Загрузка связанных данных в EF бывает трёх видов:

  • Отложенная загрузка (lazy loading)
  • Прямая загрузка данных (eager loading)
  • Явная загрузка (explicit loading)

По умолчанию в EF включена ленивая загрузка, я обычно сразу отключаю её - сразу на уровне всего контекста:

public class DataContext : DbContext
{
    public DataContext()
        : base("name=Asdf")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
    public DbSet<Somethig> Somethig{ get; set; }
    ...
READ ALSO
Программа для манипуляции файлами

Программа для манипуляции файлами

В общем поставлена задача написать информационную систему с манипуляцией текстовыми файлами, в которой будет 3-4 роли(которые имеют свои...

229
Ошибка при попытке запуска проекта в VS 2017 Remote Debugger

Ошибка при попытке запуска проекта в VS 2017 Remote Debugger

Решил поэкспериментировать с удаленным дебаггом, после его настройки на удаленном компьютере (он находится в локальной сети), и указав в настройках...

459
Записать и прочитать dll как массив байт

Записать и прочитать dll как массив байт

Есть dll которая нормально работаетПеревожу её в массив байт вот так :

209
Как добавить пользовательский класс в Windows Forms?

Как добавить пользовательский класс в Windows Forms?

Код писался под консоль, что-то вроде калькулятора для комплексных чисел, с перегрузкой каждого оператораКак перенести этот класс? В форме...

264