Застрял, пытаясь сделать вспомогательный метод для сохранения изменений БД с отловом - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над проектом с C # MVC, использующим Entity Framework 6.0, и у меня есть куча моделей, таких как Customer, Promotion, Messages, и во всех них я довольно неэффективен с повторяющейся логикой обработки ошибок.Например, вот как я сохраняю новые записи клиентов.

Обратите внимание на проверку ошибок длины!

public class CustomerRepository : IRepository<Customer>

   {

       private MyDBEntities db = new MyDBEntities();

       public uniqueIdentifier AddRecord (Customer record) {
           record.PromotionStatus = CheckForPromo(record);
           record.LastOrderID = GetLastOrderID(record);

           db.Customer.Add(record);

           try {db.SaveChanges();}
           catch (DbEntityValidationException e){
               foreach (var err in e.EntityValidationErrors){
                   Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following errors", err.Entry.Entity.GetType().Name, err.Entry.State);

                   foreach (var innerErr in err.ValidationErrors){
                       Console.WriteLine("--Property of \"{0}\"  has error \"{1}\"" , innerErr.PropertyName, innerErr.ErrorMessage);
                   }
               }
           }
           return record.id;
       }//end of AddRecord 

   }    

У меня есть несколько разных классов, смоделированных в EF и в моих таблицах, например:

  • Клиент
  • Акции
  • Сообщения

Каждый из них имеет очень похожий блок сохранения, похожий на этот:

       db.Customer.Add(record);

       try {db.SaveChanges();}
       catch (DbEntityValidationException e){
           foreach (var err in e.EntityValidationErrors){
               Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following errors", err.Entry.Entity.GetType().Name, err.Entry.State);

               foreach (var innerErr in err.ValidationErrors){
                   Console.WriteLine("--Property of \"{0}\"  has error \"{1}\"" , innerErr.PropertyName, innerErr.ErrorMessage);
               }
           }
       }

Единственное, что отличается между ними, это то, является ли он db.Customer.Add(record); или db.Promotion.Add(record); илискоро.

Я думал, что смогу добавить новый метод в репо, например,

private void TrySaveRecord(string recordType, object record){
       db.recordType.Add(record);

       try {db.SaveChanges();}
           catch (DbEntityValidationException e){
               foreach (var err in e.EntityValidationErrors){
                   Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following errors", err.Entry.Entity.GetType().Name, err.Entry.State);

                   foreach (var innerErr in err.ValidationErrors){
                       Console.WriteLine("--Property of \"{0}\"  has error \"{1}\"" , innerErr.PropertyName, innerErr.ErrorMessage);
                   }
               }
           }

   }

Но я столкнулся с проблемой MyDbEntities does not contain a definition for 'recordType'.С тех пор я крутился вокруг водоворота депрессии, кажется, что это, вероятно, выполнимо, но я не знаю словаря для этой области, чтобы понять, как описать то, что я пытаюсь сделать.

Спасибо за любые указатели:)

1 Ответ

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

Есть несколько способов справиться с этим.

Наиболее очевидным является выделение Add из вспомогательного метода и обработка только SaveChanges.

Другой способ заключается всделайте ваш вспомогательный метод универсальным и используйте метод Set<T>() для доступа к связанному DbSet:

private void TrySaveRecord<T>(T record)
    where T : class
{

    db.Set<T>().Add(record);
    // ...

Другой способ - использовать GetType() и не универсальный метод Set(Type):

private void TrySaveRecord(object record)
{

    db.Set(record.GetType()).Add(record);
    // ...

или аналогичный, но с использованием метода Entry(object) и установкой State на EntityState.Added (что в EF6 совпадает с вызовом DbSet.Add метода):

private void TrySaveRecord(object record)
{

    db.Entry(record).State = EntityState.Added;
    // ...
...