Запрос к таблице, которая относится к нескольким типам сущностей - PullRequest
0 голосов
/ 24 июня 2019

Так что в настоящее время у меня есть модель приложения:

Note -> Thing

(примечание может относиться ко многим things)

A thing может быть множеством объектов (для этого примера можно использовать Computer & Car)

например,

Note -> Computer
     -> Car

Итак, сейчас у меня есть схема

Note -> ComputerNote -> Computer
Note -> CarNote      -> Car

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

В идеале было бы неплохо иметь столбец EntityId & EntityTypeId & в таблице Note, который будет содержать первичный ключ связанной сущности и тип сущности. Таким образом, логика приложения могла бы искать все заметки Car, где автомобиль x, без отдельного запроса для каждого типа, но ... это означало бы, что я потерял ссылочную целостность. Есть ли лучший способ, или я предложил приемлемый дизайн?

Модель Entity Framework:

public partial class Note
{
    public Note()
    {
        NoteComputer = new HashSet<NoteComputer>();
        NoteCar = new HashSet<NoteCar>();
        NoteThing = new HashSet<NoteThing>();
    }

    public int Id { get; set; }
    public string Value { get; set; }
    public string CreatedByUserId { get; set; }
    public DateTime CreatedDateTime { get; set; }

    public ICollection<NoteComputer> NoteComputer { get; set; }
    public ICollection<NoteCar> NoteCar { get; set; }
    public ICollection<NoteThing> NoteThing { get; set; }

}
public partial class NoteCar
{
    public int Id { get; set; }
    public int NoteId { get; set; }
    public int CarId { get; set; }

    public Car Car { get; set; }
    public Note Note { get; set; }
}
public partial class NoteComputer
{
    public int Id { get; set; }
    public int NoteId { get; set; }
    public int ComputerId { get; set; }

    public Computer Computer { get; set; }
    public Note Note { get; set; }
}
public partial class NoteThing
{
    public int Id { get; set; }
    public int NoteId { get; set; }
    public int ThingId { get; set; }

    public Thing Thing { get; set; }
    public Note Note { get; set; }
}

1 Ответ

0 голосов
/ 25 июня 2019

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

public GenericEntityProvider 
{
    private readonly IEnumerable<IEntityProvider> _entityProviders;
    private readonly DatabaseContext _context;

    public GenericEntityProvider(IEnumerable<IEntityProvider> entityProviders, DatabaseContext context) 
    {
        _entityProviders = entityProviders;
        _context = context;
    }

    public IEnumerable<Note> Get(Type type, int id) {
        var provider = _entityProviders.GetPredicate(type, id);
        return _context.Notes.Where(provider);
    }

}

public CarNoteProvider : IEntityProvider 
{
    public Expression<Func<Note, bool>> GetPredicate(Type type, int id) 
    {
        return x => x.CarNote.Any(cn => cn.CarId == id);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...