EF Core .Include теряет записи, когда в связанной таблице есть записи, физически удаленные - PullRequest
0 голосов
/ 14 июля 2020

EDIT: Чтобы добавить некоторую уточняющую информацию.

У Payment.cs есть это свойство FK

[ForeignKey(nameof(LocationId))]
public Guid LocationId { get; set; }

Это контекст базы данных для Payments в контексте называется cpContext.cs

modelBuilder.Entity<Payments>(entity =>
        {
            entity.HasKey(e => e.PaymentId)
                .IsClustered(false);

            ... other properties ...

            entity.Property(e => e.TzgRecordId).HasMaxLength(50);

            entity.Property(e => e.Utc).HasColumnType("datetime");
        });

        modelBuilder.Entity<InvoiceStatuses>(entity =>
        {
            entity.HasKey(e => e.InvoiceStatus);

            entity.ToTable("InvoiceStatus", "enum");

            entity.Property(e => e.InvoiceStatus).HasColumnName("InvoiceStatus");

            entity.Property(e => e.Description)
                .IsRequired()
                .HasMaxLength(50);
        });

        modelBuilder.Entity<PaymentStatuses>(entity =>
        {
            entity.HasKey(e => e.Status);

            entity.ToTable("PaymentStatus", "enum");

            entity.Property(e => e.Status).ValueGeneratedNever();

            entity.Property(e => e.Description)
                .IsRequired()
                .HasMaxLength(50);
        });

        //Have to include these for the joins across databases to display the value instead of ID
        modelBuilder.Entity<DeviceTypes>(entity =>
        {
            entity.HasKey(e => e.DeviceType);
        });

        modelBuilder.Entity<Devices>(entity =>
        {
            entity.HasKey(e => e.DeviceId);
        });

        modelBuilder.Entity<Organizations>(entity =>
        {
            //entity.ToTable("Organizations", "[opkCore].dbo");
            entity.HasKey(e => e.OrgId);
        });

        modelBuilder.Entity<OrgUnits>(entity =>
        {
            entity.HasKey(e => e.OrgUnitId);
        });

        modelBuilder.Entity<Locations>(entity =>
        {
            entity.HasKey(e => e.LocationId)
                .HasName("PK_Location");
        });

        modelBuilder.Entity<InventoryModes>(entity =>
        {
            entity.HasKey(e => e.InventoryMode);
        });

Locations.cs имеет это и многие другие поля, но это релевантный материал:

[Key]
public Guid LocationId { get; set; }

Это в контексте базы данных для Location (в другом context, называемый dataContext.cs), и, конечно же, множество других полей данных:

 modelBuilder.Entity<Locations>(entity =>
        {
            entity.HasKey(e => e.LocationId)
                .HasName("PK_Location");

            ... other properties ...

            entity.Property(e => e.ValidationButtonCaption)
                .HasMaxLength(10)
                .HasComment("Name of the validation button.");
        });

        //Have to include these for the joins across databases to display the value instead of ID
        modelBuilder.Entity<InvoiceStatuses>(entity =>
        {
            entity.HasKey(e => e.InvoiceStatus);
        });

        modelBuilder.Entity<PaymentStatuses>(entity =>
        {
            entity.HasKey(e => e.Status);
        });

        modelBuilder.Entity<Payments>(entity =>
        {
            entity.HasKey(e => e.PaymentId)
                .IsClustered(false);
        });

        modelBuilder.Entity<DeviceTypes>(entity =>
        {
            entity.HasKey(e => e.DeviceType);
        });

        modelBuilder.Entity<Devices>(entity =>
        {
            entity.HasKey(e => e.DeviceId);
        });


        modelBuilder.Entity<InventoryModes>(entity =>
        {
            entity.HasKey(e => e.InventoryMode);

            entity.Property(e => e.InventoryMode).ValueGeneratedNever();

            entity.Property(e => e.Name)
                .IsRequired()
                .HasMaxLength(50);
        });

ОРИГИНАЛ: Как я могу преобразовать это, чтобы вернуть записи, даже если запись Location отсутствует в таблице Locations? Все работает отлично, за исключением того, что иногда в таблице Location нет записи, которая соответствует LocationId в записи платежа. Запись о местоположении была удалена. Удаление .Include возвращает все, но тогда, конечно, все столбцы данных Location, которые я хочу отобразить, пусты, когда есть запись Location, к которой нужно присоединиться.

var listForView = payments.AsNoTracking()
.Include(payments => payments.PaymentStatuses)
.Include(payments => payments.InvoiceStatuses)
.Include(payments => payments.Organizations)
.Include(payments => payments.Locations);

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

                payments = from pmts in _context.Payments
                       select pmts;

Я пробовал несколько решений, таких как выполнение соединения другим способом, чем использование .Include, но они делают это, поэтому я не получаю никаких данных о строках, к которым нужно присоединиться. Может ли кто-нибудь указать мне в правильном направлении, как сделать соединение, которое позволит мне отображать связанные данные, когда они есть, но не полностью удалять запись из набора данных, когда данных нет? Если эти столбцы пусты, это нормально (данных нет), но я не хочу, чтобы записи полностью отсутствовали.

Спасибо за вашу помощь

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