2013-07-22 3 views
0

Все мои таблицы в базе данных имеют столбцы с именем «r_e_c_n_o_», не являются автоинкрементным столбцом, и нет возможности изменить его. Его база данных ERP от третьей компании, и они используют их aproach для создания базы данных.EF Возврат следующего значения из не-общего dbset

Итак ... что мне нужно, это общий метод для увеличения значения в SaveChanges() метод автоматически, в настоящее время I'm с помощью метода приведены ниже:

public static int GetNextRecno<T>(this DbContext context) where T : DadosadvEntityBase 
    { 
     lock (_locker) 
     { 
      var typeName = typeof(T).FullName; 
      int next = 1; 
      if (lastRecnos.ContainsKey(typeName)) 
      { 
       int lastRecno = lastRecnos[typeName]; 
       next = lastRecno + 1; 
      } 
      else 
      { 
       next = context.Set<T>().Max(x => x.Recno) + 1; 
      } 
      lastRecnos[typeName] = next; 
      return next; 
     } 

И Я бы хотел, чтобы достичь то же самое, используя необщего типа, что-то вроде (смотрите комментируемой линия):

public static int GetNextRecno(this DbContext context, Type entityType) 
    { 
     lock (_locker) 
     { 
      var typeName = entityType.FullName; 
      int next = 1; 
      if (lastRecnos.ContainsKey(typeName)) 
      { 
       int lastRecno = lastRecnos[typeName]; 
       next = lastRecno + 1; 
      } 
      else 
      { 
       //here is the problem with a non-generic type, I have no idea how to get next value in this case 
       next = context.Set<T>().Max(x => x.Recno) + 1; 
      } 
      lastRecnos[typeName] = next; 
      return next; 
     } 

ответ

2

Вы можете сделать экземпляр entityType и затем вызвать исходный общий метод расширения:

public static int GetNextRecno(this DbContext context, Type entityType) 
{ 
    //create an instance of entityType 
    dynamic instance = Activator.CreateInstance(entityType); 
    return GetNextRecno(context, instance); 
} 

//note this is not an extension method 
public static int GetNextRecno<T>(DbContext context, T instance) 
{ 
    //call your original generic extension method 
    return context.GetNextRecno<T>(); 
} 
Смежные вопросы