ServiceStack SqLite 计算字段的创建

ServiceStack SqLite Creation of Compute field

我正在尝试使用内存数据库(使用 ServiceStack.OrmLite.Sqlite.Windows)在基于 servicestack 的 Web api 中进行单元测试。 我创建了一个 table 以使用现有模型 class.The 模型 class 插入内存​​数据库,table 创建和插入代码如下

            [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); 

我们在创建市场 table 时使用以下表达式计算 SqlServer 中的 AvailableTotal 字段值,

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

当我尝试通过单元测试将上述市场对象插入 InMemory 数据库时,出现以下异常

OneTimeSetUp:System.Data.SQLite.SQLiteException:约束失败 NOT NULL 约束失败:Market.AvailableTotal

我发现异常是 Market Class 的 [Compute] 属性的结果,并且在我进行更改 InMemory 数据库测试时得到了将其替换为 [Compute,ServiceStack.DataAnnotations.Ignore] 的建议工作正常但是当我通过实时数据库测试它时,即使在数据库中计算并更新了 AvailableTotal 值,它也会被忽略并在返回响应时分配值 0。

在 InMemory 数据库中创建 table 时,是否有任何方法可以定义此 AvailableTotal 字段表达式,同时保持 [Compute] 属性以克服此异常?

您可以暂时禁用计算行为:

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

fieldDef.IsComputed = false;

db.Insert(market);

fieldDef.IsComputed = true;