1

Я пытаюсь использовать базу данных inMemory (используя ServiceStack.OrmLite.Sqlite.Windows) для модульного тестирования в веб-api на основе servicestack. я создал таблицу для вставки в базу данных InMemory с использованием кодов существующей модели class.The класса модели, создание таблицы и вставки являютсяServiceStack SqLite Создание поля вычисления

  [Alias("Market")] 
      public class Market 
      { 
       [AutoIncrement] 
       [Alias("ID")] 
       public int Id { get; set; } 
       [Required] 
       public int Available { get; set; }  
       [Required] 
       public int AvailableSalesEvent { get; set; } 
       [Compute]   
       [Required] 
       public int AvailableTotal { get; set; }     
       [Required] 
       public int? MinCustomerBuy { get; set; } 
      } 


      db.DropAndCreateTable<Market>(); 
      var market = new Market() 
      {          
       Available = 10,         
       AvailableTotal = 0, 
       AvailableSalesEvent = 2,           
       MinCustomerBuy = 10 
      }; 
      db.Insert(market); 

мы вычисляя значение AvailableTotal поля в нашем SqlServer при создании таблицы рынка используя выражение следующим образом,

 [AvailableTotal] AS (isnull([Available]+[AvailableSalesEvent],(0))) 

при попытке вставить выше объект рынка к базе данных InMemory через модульное тестирование, я получал следующее исключение

OneTimeSetUp: System.Data.SQLite.SQLiteException: ограничение не удалось NOT NULL ограничения не удалось: Market.AvailableTotal

я узнал исключением является результатом [Compute] атрибута рынка класса, и получил предложения заменить его [Compute, ServiceStack .DataAnnotations.Ignore], когда я сделал изменения. Тесты базы данных InMemory работают нормально, но когда я протестировал его через живую базу данных, хотя значение AvailableTotal вычисляется и обновляется в БД, оно игнорируется, а при возврате ответа присваивается значение 0.

Есть ли способ определить это выражение AvailableTotal Field, создавая таблицу в базе данных InMemory, сохраняя атрибут [Compute], поскольку он должен превышать это исключение?

ответ

2

Вы можете временно отключить вычисленного поведение с:

var fieldDef = typeof(Market).GetModelMetadata() 
    .GetFieldDefinition<Market>(x => x.AvailableTotal); 

fieldDef.IsComputed = false; 

db.Insert(market); 

fieldDef.IsComputed = true; 
+0

Спасибо за ответ он работал для меня. как установить fieldDef.ComputeExpression в servicestack.Ormlite. он запрашивает строковый ввод. – kgangadhar

+0

@ G.Karthik вам не нужно устанавливать ComputeExpression, просто отключите IsComputed, чтобы отключить поведение. – mythz