Структура субъекта: иностранный субъект, не требующий, чтобы иностранный субъект существовал - PullRequest
0 голосов
/ 18 марта 2020

У меня есть система, похожая на отслеживание аудита, которая содержит следующие две сущности: сущность JobCreate:

public class JobCreate
{
    [Key] public string JobId { get; set; }

    public List<AffectedEntity> AffectedEntities { get; set; }
}

и сущность AffectedEntity:

public abstract class AffectedEntity
{
    [Required]
    public string JobId { get; set; }

    public int Id { get; set; }

    [CanBeNull] public JobCreate Job { get; set; }
}

Пока это просто нормальное отношение внешнего ключа:

modelBuilder.Entity<JobCreate>()
    .HasMany(j => j.AffectedEntities)
    .WithOne(a => a.Job)
    .HasForeignKey(a => a.JobId)
    .IsRequired(false)
    .OnDelete(DeleteBehavior.Cascade);

Entity Framework генерирует внешний ключ для этого отношения. Моя проблема заключается в том, что эта система аудита управляется событиями, что означает, что она получает события, которые создают AffectedEntity, и событие, которое создает записи JobCreate не по порядку. Другими словами, сущность JobCreate может еще не существовать при создании AffectedEntity. Однако, что касается домена, это на самом деле хорошо. Так как мне смоделировать это в Entity Framework? Я хочу иметь возможность "перемещаться" по этому соединению от JobCreate до AffectedEntity, однако в другом направлении нет необходимости.

1 Ответ

1 голос
/ 18 марта 2020

сущность JobCreate может еще не существовать при создании ActedEntity. Однако, что касается домена, это на самом деле хорошо. Так как мне смоделировать это в Entity Framework?

Просто имейте отношение в модели EF, но опустите его или установите FK так, чтобы он не применялся в бэкэнде. Например, на SQL сервере вы бы установили ограничение внешнего ключа равным NOCHECK.

Просто помните, что EF может предполагать, что FK применяется при создании запросов. Например, если вы запросите db.AffectedEntities.Inclue("JobCreate"), он может использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ и не возвращать никакие объекты ActedEntities без JobCreate.

И если вам нужно иметь дело с AfferedEntities с нулевым идентификатором JobID, вам придется изменить тип данных до int?.

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