卡住了尝试创建一个辅助方法来保存数据库更改并捕获

时间:2018-12-03 17:51:37

标签: c# entity-framework entity-framework-6

我正在使用使用Entity Framework 6.0的C#MVC开发一个项目,并且我有很多模型,例如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 :(得分:2)

有几种处理方法。

最明显的是将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;
    // ...