Динамическое имя таблицы EF CORE 2.2 - PullRequest
0 голосов
/ 21 декабря 2018

Хочу сделать универсальный метод для работы с таблицами.Изучаемые ссылки

Сначала необходимо динамически создать объект модели в БД Entity Framework, передав тип в качестве параметра

Динамически обращаться к таблице в EF Core 2.0

В качестве примера ниже показан контроллер ASP.NET CORE для одной из таблиц SQL.Есть много таблиц.Необходимо реализовать такие методы (DEL, ADD, CHANGE) для каждой таблицы:

    [Authorize(Roles = "Administrator")]
    [HttpPost]
    public ActionResult DeleteToDB(string id)
    {
        webtm_mng_16Context db = new webtm_mng_16Context();

        var Obj_item1 = (from o1 in db.IT_bar 
                         where o1.id == int.Parse(id)
                         select o1).SingleOrDefault();
        if ((Obj_item1 != null))
        {
            db.IT_bar.Remove(Obj_item1);
            db.SaveChanges();
        }
        var Result = "ok";

        return Json(Result);

    }

Я хочу получить универсальный метод для всех таких операций с возможностью динамического изменения имени таблицы.В идеале, установите имя таблицы в виде строки.Я знаю, что это можно сделать с помощью вставок SQL, но в действительности нет простого способа реализовать это в EF CORE

1 Ответ

0 голосов
/ 21 декабря 2018

Извините, но вам нужно переработать вашу модель.

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

То, что вы также можете сделать, - это базовый базовый класс, принимающий классы, с которыми вы работаете, в качестве параметров.У меня есть такие - взять (a) тип сущности db и (b) тип dto на стороне API, а затем использовать некоторые универсальные функции и Automapper для сопоставления между ними.

Но в тот момент, когда вам нужно захватить имя таблицыдинамически вы находитесь в мире боли.Стандартная архитектура EF предполагает, что тип объекта отображается на объект базы данных.Таким образом, идентификатор уникален в таблице - от этого зависит вся реляционная модель.Идентификатор 44 должен быть уникальным для конкретного объекта, а не для объекта и таблицы, из которой он был загружен в данный момент.

Вы также значительно упускаете из виду логику, то есть для удаления.Я не хочу вам этого говорить, но хотя вы можете реализовать защиту на других уровнях для чтения, каждый из моих методов записи / обновления написан от руки.Теперь может показаться, что «Авторизация» работает, но нет.Или - если ваше приложение является комплексом "Hello world".Я иногда запускаю страницы тестирования кода, разрешена ли операция в определенном бизнес-контексте, и это зависит от конкретной ИС, установил ли пользователь переключатель переопределения (который может или не может быть действительным в зависимости от того, кем он является), в обход определенных бизнес-правил.Всё это в любом случае специфично.

О, что вы тоже можете сделать ... потому что у вас, кажется, много таблиц: НЕ используйте один класс, генерируйте их.Леса не так сложны.Я почти не помню, когда я сгенерировал последние базовые классы базы данных EF - в настоящее время все они исходят из Entity Developer (инструмент от Devart), в то время как база данных обрабатывается сценариями изменений (сначала я работаю с базой данных - я на самом деле хочу использовать базу данных иэто означает отфильтрованные индексы, триггеры, некоторые sp и представления с конкретным SQL), поэтому миграции на самом деле не работают вообще.

Но теперь динамическое перезапись имени таблицы - при сохранении того же объекта в фоновом режиме -кусать тебя довольно быстро.Скорее всего, он работает только для чрезвычайно упрощенных вещей - вы знаете, пример «Привет, мир» - и разбивается на части, когда у вас действительно есть логика.

...