Как я могу сделать мое консольное приложение более пригодным для повторного использования в разных базах данных? - PullRequest
0 голосов
/ 12 марта 2019

Возьмите, например, базу данных pubs и таблицу employee. У меня есть следующий надуманный пример, который читает группы сотрудников и просто обновляет столбец фамилии, используя Entity Framework 6.0.

Допустим, я хочу использовать это для обновления информации о сотрудниках в базе данных Northwind. Есть ли хороший способ сделать это без создания 2-х разных программ, потому что, если для другой похожей таблицы сотрудников в другой базе данных потребуется третье консольное приложение.

Предположим, что поля в разных базах данных одинаковы, но могут иметь разные имена для полей.

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;

namespace EFTransactionConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (pubsEntities dbContext = new pubsEntities())
            {
                using (DbContextTransaction transaction = dbContext.Database.BeginTransaction())
                {
                    IEnumerable<employee> employees = null;
                    int currentPage = 1;
                    int totalPages = dbContext.employees.Count();
                    string lastEmpId = string.Empty;

                    try
                    {
                        do
                        {
                            employees = (from x in dbContext.employees
                                         where string.Compare(x.emp_id, lastEmpId) > 0
                                         orderby x.emp_id
                                         select x).Take(5).ToList();

                            if (employees.Count() > 0)
                            {
                                lastEmpId = employees.Last().emp_id;

                                //var fifthEmp = dbContext.employees.Where(x => x.emp_id == lastEmpId).FirstOrDefault();
                                //fifthEmp.lname += "test";


                                dbContext.Database.ExecuteSqlCommand(@"
                                UPDATE employee SET lname = " + "'test 123'" + " WHERE emp_id = '" + lastEmpId + "'"
                                    );

                                //foreach (var item in employees)
                                //{
                                //    Console.WriteLine("{0}-{1}", item.emp_id, item.fname);
                                //}
                                //dbContext.SaveChanges();
                            }

                            if (currentPage == 6)
                                throw new Exception("Error occurred");

                            currentPage++;

                        } while (currentPage <= totalPages);

                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                    }
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете рассмотреть шаблон репозитория. См. https://www.infoworld.com/article/3107186/how-to-implement-the-repository-design-pattern-in-c.html в качестве образца статьи.

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

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