Есть ли способ объединить равные таблицы в той же модели и в том же контроллере? - PullRequest
0 голосов
/ 17 апреля 2019

Я выполнил проект веб-приложения ASP.NET и добавил два элемента модели данных сущности ADO.NET из базы данных с соответствующим им контроллером.

Дело в том, что обе базы данных содержат одинаковые таблицы, с одинаковой структурой, но с разными данными. Например, в обеих базах данных есть эта таблица:

public partial class User
{
    public long id { get; set; } // Autoincrement
    public string bd { get; set; }
    public string username { get; set; }
    public string password { get; set; }
    public short role { get; set; }
}

Наличие только 2, избыточность при использовании 2 моделей и 2 контроллера, не было большой проблемой, но теперь я хочу добавить больше баз данных с одинаковыми характеристиками (таблица пользователей с той же структурой, но разными данными)

Есть ли способ объединить все таблицы и иметь один контроллер? И, кроме того, контроллер позволил бы мне сделать:

• GET all: получить все данные из всех пользовательских таблиц

• GET / id / bd: получить данные с id и bd, переданными в URL

• POST: добавить нового пользователя в базу данных, хранящуюся в атрибуте bd

• PUT / id: изменить данные с помощью идентификатора и базы данных, хранящихся в атрибуте bd

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

хорошо, если все ваши таблицы одинаковы, вам не нужно несколько избыточных моделей, вы можете просто использовать одну. это решает одну сторону вопроса.

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

ваши маршруты могут выглядеть как api / client1 / users, например. идентификатор клиента1 говорит вам, к какой базе данных вам нужно подключиться.

Есть, конечно, и другие соображения, например, может быть, вам нужно раскрыть это внешнему миру. в этом случае вы можете использовать систему авторизации JWT, вы выдаете каждому клиенту ClientID, а затем на основе ClientID вы знаете, к какой базе данных подключаться. Если вы используете такую ​​систему, вам не нужно передавать никаких дополнительных данных в URL, вы выдаете токен, добавляете заявку с указанием используемой базы данных, и все готово.

0 голосов
/ 18 апреля 2019

Спасибо за ответы, но я смог решить это по-другому.

Я сохранил различные базы данных в словаре, указав в качестве имени базы данных ключ и значение динамического типа. Таким образом, вместо вызова объекта базы данных, я вызываю динамику словаря, хранящегося в базе данных, передаваемого параметром в запросе. Таким образом, я могу добавить больше баз данных, просто добавив еще один элемент в словарь, избавив меня от лишнего кода.

Чтобы привести пример изменения, я покажу вам метод Get / id / bd, как раньше, так и сейчас:

public class UsersController : ApiController
{
    // Before
    private typeDB1 db = new typedb1();
    private typeDB2 db2 = new typedb2();

    [ResponseType(typeof(User))]
    [Route("api/users/{id}/{bdatos}")]
    public IHttpActionResult GetUser(long id, string bdatos)
    {
        try
        {
            if(bdatos == "typeDB1")
            {
                typeDB1.User userdb1 = typeDB1.Find(id);
                if (userdb1 == null)
                {
                    return NotFound();
                }

                return Ok(userdb1);
            }
            else
            {
                typeDB2.User userdb2 = typeDB2.Find(id);
                if (userdb2 == null)
                {
                    return NotFound();
                }

                return Ok(userdb2);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    // Now
    private typeDB1 db = new typedb1();
    private typeDB2 db2 = new typedb2();

    private Dictionary<string, dynamic> dbDictionary = new Dictionary<string, dynamic>
    {
        ("typeDB1", db),
        ("typeDB2", db2)
    };

    [ResponseType(typeof(User))]
    [Route("api/users/{id}/{bdatos}")]
    public IHttpActionResult GetUser(long id, string bdatos)
    {
        try
        {
            dynamic certificate = dbDictionary[bdatos].Find(id);
            if (certificate == null)
            {
                return NotFound();
            }

            return Ok(certificate);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}
0 голосов
/ 17 апреля 2019

Вы можете использовать AutoMapper для сопоставления моделей данных пользователя (из разных баз данных) с объектом User, который вы используете в вашем контроллере.

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