Связанные данные автоматически загружаются в .net core 2.2 - PullRequest
1 голос
/ 30 сентября 2019

Я использую .net core 2.2 с Entity Framework Code-First, и я создаю некоторые модели с отношениями, и все отношения работают хорошо, если только отношения с моделью поиска, которые автоматически загружают связанные данные модели и обратное свойствотоже

Вот код

Company.cs

public class Company
{

    public Company()
    {
        Lookups = new HashSet<Lookup>();
    }

    public Guid Id { get; set; }

    // Relationships

    // Address
    [ForeignKey("AddressForeignKey")]
    public Address Address { get; set; }

    // User
    [InverseProperty("Company")]
    public List<User> UsersInCompany { get; set; }

    // Lookup as a country
    public Guid? CountryId { get; set; }
    public Lookup Country { get; set; }

    // Lookup as a bank
    public Guid? BankId { get; set; }
    public Lookup DefaultBank { get; set; }

    // Lookup as a socialInsuranceOffice
    public Guid? SocialInsuranceOfficeId { get; set; }
    public Lookup DefaultSocialInsuranceOffice { get; set; }

    // Lookup as a currency
    //[ForeignKey("DefaultCurrencyForeignKey")]
    public Guid? CurrencyId { get; set; }
    public Lookup Currency { get; set; }

    // Lookup for all lookups types
    public ICollection<Lookup> Lookups { get; set; }

}

Address.Cs

public class Address
{
    public Guid Id { get; set; }

    // Relationships

    // Company
    [InverseProperty("Address")]
    public List<Company> Companies { get; set; }

    // Lookup as a governorate
    [ForeignKey("LookupForeignKey")]
    public Lookup GovernorateLookup { get; set; }
}

DataContext.Cs

   // Company and Address
        modelBuilder.Entity<Company>()
            .HasOne(u => u.Address)
            .WithMany(r => r.Companies)
            .OnDelete(DeleteBehavior.SetNull);

   // Address and Lookup
        modelBuilder.Entity<Address>()
            .HasOne(a => a.GovernorateLookup)
            .WithMany(l => l.GovernoratesUserAsAddress)
            .OnDelete(DeleteBehavior.SetNull);

  modelBuilder.Entity<Company>(com =>
        {
            // Company and Lookup for defaultCountry
            com.HasOne(c => c.Country)
            .WithMany(d => d.CompanyCountries)
            .HasForeignKey(f => f.CountryId)
            .HasConstraintName("COM_COUNTRY_FK")
            .OnDelete(DeleteBehavior.Restrict);

            // Company and Lookup for defaultBank
            com.HasOne(c => c.DefaultBank)
            .WithMany(d => d.CompanyBanks)
            .HasForeignKey(f => f.BankId)
            .HasConstraintName("COM_BANK_FK")
            .OnDelete(DeleteBehavior.Restrict);

            // Company and Lookup for defaultSocialInsuranceOffice
            com.HasOne(c => c.DefaultSocialInsuranceOffice)
            .WithMany(d => d.CompanySocialInsuranceOffices)
            .HasForeignKey(f => f.SocialInsuranceOfficeId)
            .HasConstraintName("COM_SOCIALINSURANCEOFFICE_FK")
            .OnDelete(DeleteBehavior.Restrict);

            // Company and Lookup for currency
            com.HasOne(c => c.Currency)
            .WithMany(d => d.CompanyCurrencies)
            .HasForeignKey(f => f.CurrencyId)
            .HasConstraintName("COM_CURRENCY_FK")
            .OnDelete(DeleteBehavior.Restrict);


            // Company and Lookup for all Lookups types
            com.HasMany(c => c.Lookups)
           .WithOne(d => d.Company)
           .HasForeignKey(f => f.CompanyId)
           .HasConstraintName("COM_ALL_LOOKUPS_FK")
           .OnDelete(DeleteBehavior.Cascade);

        });

Обратите внимание, что все отношения работают хорошо, но только отношение с поиском «У меня есть 5 отношений с одним и тем же просмотром таблицы» автоматически загружает все данные и обратное, и мне нужно знать, почему это происходит и как я могу это остановить.

Заранее спасибо.

1 Ответ

1 голос
/ 30 сентября 2019

Ваш вопрос труден для понимания, но я считаю, что "проблема" - это исправление объекта EF. Я цитирую «проблему», потому что на самом деле это функция .

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

Когда дело касается отношенийесли EF имеет связанные объекты уже в своем кеше объектов, он выполняет «исправление», где он автоматически добавляет связанные экземпляры в свойство навигации. Опять же, это функция оптимизации, так как теперь вам не нужно создавать другой запрос для их получения.

Единственный способ обойти это - использовать AsNoTracking при запросе. Например:

var companies = await _context.Companies.AsNoTracking().ToListAsync();

При AsNoTracking EF не будет поддерживать кэш объектов и не будет отслеживать изменения этих объектов. Эта последняя часть важна, потому что вам нужно быть очень осторожным, если вы попытаетесь каким-либо образом изменить эти объекты, так как EF не будет знать о них, пока вы явно не присоедините их. Однако, если вы просто выполняете чтение, использование AsNoTracking на самом деле более эффективно в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...