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;
我正在尝试使用内存数据库(使用 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;