2016-09-23 2 views
4

У меня есть 2 классов, SalesSubCategory и SalesCategory:Entity Framework 6: связанные объекты автоматически добавляются к родительской сущности, несмотря на отложенную загрузку выключению

[Table("SALES.SubCategory")] 
public class SalesSubCategory 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public int CategoryID { get; set; } 

    public string Name { get; set; } 

    [ForeignKey("CategoryID")] 
    public SalesCategory SalesCategory { get; set; } 
} 

[Table("SALES.Category")] 
public class SalesCategory 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

Этот метод возвращает список SalesSubCategories БЕЗ SalesCategory Объект загружен

public class TestController : Controller 
{ 
    private readonly MD_Context _context; 

    public TestController(MD_Context context) 
    { 
     _context = context; 
    } 
    public async Task<List<SalesSubCategory>> NoRelated() 
    { 
     var subCategories = await _context.SalesSubCategories.ToListAsync(); 
     return subCategories; 
    } 

Related Entity not Loaded

Этот метод возвращает список SalesSubCategories с SalesCategory Объект загружен

public async Task<List<SalesSubCategory>> Related() 
{ 
    var subCategories = await _context.SalesSubCategories.ToListAsync(); 
    var categories = await _context.SalesCategories.ToListAsync(); 
    return subCategories; 
} 

Related Entity loaded

MD_Context сконфигурирован, чтобы отложенная загрузка отключена:

Configuration.LazyLoadingEnabled = false; 

Это ожидаемое поведение? Мой предпочтительный результат: НЕ иметь предварительно загруженные объекты объекта SalesCategory.

спасибо.

ответ

1

Да, это ожидаемое поведение.

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

Вы можете решить эту проблему, запросив запрос на не отслеживание. Это не приведет к тому, что entityframework свяжет его с вашим новым запросом.

var subCategories = await _context.SalesSubCategories.ToListAsync(); 
var categories = await _context.SalesCategories.AsNoTracking().ToListAsync(); 
+0

Фантастично, спасибо! – Gmd3

+0

Итак, оглядываясь вокруг, похоже, что нет никаких глобальных настроек, чтобы это применимо ко всем моим запросам ... painful – Gmd3

+0

Каждый ORM отличается, я полагаю, что решение EntityFramework для этого поведения связано с тем, что они считают, что люди будут использовать их не просто для извлечения результаты в объекты строго типа, но также для управления объектами результатов запроса. Вы можете использовать Dapper.NET или какую-то более урезанную функцию, например ORM, для вашего желаемого поведения, это даст вам возможность для объектов с категориальным типом без концепции db-контекста. –

0

хорошо я вижу вашу точку зрения, и это может быть ошибка в рамках сущности, но я тестировал его на месте, и включение или отключение LazyLoadingEnabled не помогает. Я нашел, когда вложенный объект, который является SalesCategory, имеет другой вложенный объект, тогда LazyLoadingEnabled поможет и не загрузит вложенные объекты, что странно, но это то, как работает структура сущности

Смежные вопросы