Как реализовать несколько экземпляров интерфейса для разных подклассов?

Первый шаг: перейдите в /etc/phpmyadmin/config.inc.php, затем раскомментируйте строки, где вы найдете AllowNoPassword. Второй шаг: войдите в свою учетную запись по умолчанию mysql

mysql -u root -p
use mysql;
update user set plugin="" where user='root';
flush privilege;

, и это все!

2
задан vc 74 29 March 2019 в 12:38
поделиться

1 ответ

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

Receipt
    ID 
    ReceiptNumber 
    CustomerNumber 
    CustomerEmail 
    CustomerOption 
    InternalNumber 
    InternalEmail 
    InternalOption 
    DISCRIMINATOR_FIELD

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

открытый интерфейс IReceiptRepository {public Receipt Get (int id); Публичная квитанция Добавить (квитанция квитанции); }

public CustomerReceiptRepository : IReceiptRepository {
    public Receipt Get(int id) {
            var rec = DbContext.Table.Receipt.FirstOrDefault(r => r.id = id);
            if(rec.DiscriminatorField == 1) //CustomerReceipt
            {
                return new CustomerReceipt
                {
                     ID = ...
                     ReceiptNumber = ...
                     CustomerNumber = ...
                     CustomerEmail = ...
                     CustomerOption = ...
                 }
              }
              //all other cases are InternalReceipts
              return new InternalReceipt
              {
                   ID = ...
                   ReceiptNumber = ...
                   InternalNumber  = ...
                   InternalEmail = ... 
                   InternalOption = ...
              }
    }
}

То же самое для метода Add, просто заполните только те поля, которые вам нужны для этого объекта. В этой композиции все основано на поле дискриминатора. Я не предлагаю , чтобы вы реализовали свое решение таким образом, но при этом вы все равно получаете в своей ViewModel общую квитанцию. Я предлагаю вам прочитать больше об ORM, который вы используете, и о том, как вы можете представить там наследование (может быть, вы сначала используете базу данных, а не код, и вам придется обрабатывать вещи вручную, потому что база данных не была разработана таким образом. и вам нужно использовать подход, аналогичный тому, что я предложил. Но если у вас есть возможность создать свои классы POCO и создать базу данных, определенно стоит взглянуть на то, как они реализуют наследование.

Здесь Я прилагаю ссылку о том, как эта проблема решается в EntityFramework 6

Стратегия наследования в Entity Framework 6

Надеюсь, это поможет

0
ответ дан Zinov 29 March 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: