2014-01-20 3 views
0

Этот код работает отлично в эф 4.0, но я просто повышен до Е.Ф. 5.0 и получил следующее сообщение об ошибке при вызове сохранить измененияСохранить изменения Ошибка не может вызвать абстрактный класс C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.Objects; 
using OSPos.DBContext; 

namespace OSPos.OSPosContext 
{ 
    public abstract class ContextBase 
    { 
     public abstract bool SaveChanges(); 

     protected bool SaveChanges(ObjectContext context) 
     { 
      try 
      { 
       int i = context.SaveChanges(); 
       if (i == 0) 
        return false; 

       return true; 
      } 
      catch (Exception ex) 
      { 
       throw new EntityContextException("SaveChanges failed.", ex); 
      } 

     } 

     public abstract void DeleteObject(object entity); 

     protected void DeleteObject(ObjectContext context, object entity) 
     { 
      try 
      { 
       context.DeleteObject(entity); 
      } 
      catch (Exception ex) 
      { 
       throw new EntityContextException("DeleteObject failed.", ex); 
      } 
     } 

     protected static string pamsConnectionString; 

     public static string PamsConnectionString 
     { 
      set { pamsConnectionString = value; } 
     } 

     protected static string pamssysdbfConnectionString; 

     public static string PamssysdbfConnectionString 
     { 
      set { pamssysdbfConnectionString = value; } 
     } 

     #region Encryption Fields 

     public static string encryptionServiceUrl; 
     public static bool encryptionEnabled = false; 
     private static string encryptionTicket; 

     #endregion 
    } 
} 

Мой класс призвание заключается в следующем

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using System.ComponentModel; 
using System.Text.RegularExpressions; 
using CMSNIDataobjects.Lookups; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Entity; 
using OSPos.OSPosContext; 

namespace OSPos.OSPosContext 
{ 
    public class cmsContext : ContextBase 
    { 
     private OSPosEntities1 _OsPosEntities; 
     protected OSPosEntities1 OSPosEntities 
     { 
      get 
      { 
       if (_OsPosEntities == null) 
       { 
       // try 
       // { 
         _OsPosEntities = new OSPosEntities1();//knowledgebaseEntities1(@"metadata=res://*/KnowledgeBase.csdl|res://*/KnowledgeBase.ssdl|res://*/KnowledgeBase.msl;provider=System.Data.SqlClient;provider connection string="data source=DAVID_BUCKLEY\DBSQLSERVER28R2;initial catalog=knowledgebase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"");} 
       //} 
       //catch (Exception ex) 
       //{ 
       // throw new EntityContextException("cmsEntities object could not be created.", ex); 
       //} 
       } 
       return _OsPosEntities; 
      } 
     } 

     public override int SaveChanges() 
     { 
      return base.SaveChanges(); 
      //this is where i am getting the error in reference to abstract class 
     } 

     public override void DeleteObject(object entity) 
     { 
     } 
    } 
} 
+0

какое это исключение? –

+2

Вы не можете назвать этот метод, потому что он абстрактный. Какой у Вас вопрос? – nvoigt

+1

PS. Ваш наследник 'cmsContext' абстрактного класса ContextBase' не переопределяет абстрактные методы bool SaveChanges(). Поэтому он не будет компилироваться –

ответ

0

Класс ContextBase является абстрактным и должен быть переопределен. Вы это сделали. Но метод SaveChanges() также является абстрактным и тоже должен быть переопределен.

Если ContextBase - ваше изобретение, то, возможно, эти изменения помогут.

Если вы хотите требует подмены, а затем оставить строку:

public abstract bool SaveChanges();

... и удалить базовый метод в целом. Затем просто предоставьте переопределение в cmsContext. В противном случае, удалите его и изменить базовый метод для virtual:

protected virtual bool SaveChanges(ObjectContext context) 
{ 
    try 
    { 
     int i = context.SaveChanges(); 
     if (i == 0) 
      return false; 

     return true; 
    } 
    catch (Exception ex) 
    { 
     throw new EntityContextException("SaveChanges failed.", ex); 
    } 
} 

Сделайте то же самое для другого метода вы явно хотите использовать, DeleteObject.

Создание этих virtual позволит вам гибко переопределить только тогда, когда вам нужна определенная функциональность в производном классе, который отличается от базового класса. В противном случае вы просто используете вызванный вами вызов base.SaveChanges(), и вы получаете то, что находится в BaseContext.

Смежные вопросы