我正在使用dapper,我想使用Linq来更新我要使用的一个表中名为status的单个字段。
public async Task<Int32> ProcessUnprocessedTransactions(IEnumerable<BomComponentData> items)
{
IEnumerable<BomComponentData> _itemstoBeProcesed = items.Where(w => w.Status == (int)BomStatus.Scanned);
foreach (BomComponentData item in _itemstoBeProcesed)
{
item.Status = (int)BomStatus.Completed;
}
return await database.UpdateAsync(_itemstoBeProcesed);
}
我的课如下:
public class BomComponentData
{
public int Sequence { get; set; }
public string BOMShortName { get; set; }
public string OperationName { get; set; }
public long BomId { get; set; }
public long BOMLineID { get; set; }
public long StockItemID { get; set; }
public string BomLineType { get; set; }
public int Quantity { get; set; }
public long UnitID { get; set; }
public decimal? MultipleOfBaseUnit { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public string Barcode { get; set; }
public long ProductGroupID { get; set; }
public string ProductGroupCode { get; set; }
public int Status { get; set; }
public int BinLocation { get; set; }
public string BinName { get; set; }
public string UOM { get; set; }
public int CalculatedValue { get; set; }
public int BomPickedCount { get; set; }
public int TotalLeftTopick
{
get { return Quantity - BomPickedCount; }
}
public enum BomStatus
{
Listed=1,
Scanned=2,
Confirmed=3,
Processed=4,
Completed=4,
InVisible=5
}
public override string ToString()
{
return Code;
}
}
但是,如果我使用上述的foreach,它将不起作用。我确定它应该正确更新项目,但是我认为因为我要遍历我的foreach中的单个项目以及更新中的列表,所以更新不正确。
我要做的就是将状态标记为完成并准备好进行传输,这是通过状态列和一个int枚举完成的。
也许我遗漏了什么是主键的声明?
编辑2
当我使用主键的键声明时,我得到以下信息:
未处理的异常:System.AggregateException:发生一个或多个错误。 (约束
编辑3
我已经设置了班级的键,但是如您所见,我在数据库上有auotincrement,它仍然崩溃。应该如何处理插入?
编辑4
例如,我将如下插入数据库。这不行吗?
List<BomComponentData> _bomList = new List<BomComponentData>();
_bomList.Add(new BomComponentData { Sequence = 1, Barcode = "0000000001498", BinLocation = 23, BinName = "A", BOMShortName = "GYNE-TXX", OperationName = "Example Product", Code = "TB9175CEA", Name = "Tiburon Peri/Gynae Pack-10", Quantity = 1, UOM = "Each" });
await database.InsertAllAsync(_bomList,true);
我已将更新的标记键放置为可以正常运行,但是当我尝试使用该键插入时,它没有显示约束错误,但更新有效。没有人没有办法解决Dapper contrib中的插入和更新问题。
答案 0 :(得分:2)
您正在使用Dapper.Contrib,并且此扩展要求您使用一些属性来修饰类,以帮助自动处理数据。
特别是对于Update方法,您需要定义 Table 属性和 Key 属性以标识主键
[Table ("BomComps")]
public class BomComponentData
{
// [ExplictKey]
[Key]
public int Sequence { get; set; }
....
例如,在这里,我添加了属性 Table 来在数据库上设置可能的表名称,但是如果物理表的名称与类的名称匹配,则可以省略属性。另外,我还添加了 Key 属性来设置包含表主键的属性(因此可以使用适当的WHERE条件形成用于更新记录的语句)。
请注意,如果列的Identity属性设置为yes,则应使用 Key 属性;否则,请使用 ExplicitKey 属性来指示主键键由您的代码定义。
答案 1 :(得分:0)
这实际上是我必须将以下内容与我的课区分开的问题,以便让其他人有问题,我正在使用pcl库,但是由于某种原因,dapper贡献者未检测到必须声明为的关键元素
[SQLite.PrimaryKey, SQLite.AutoIncrement]
public class StockTransferArgs
{
[SQLite.PrimaryKey, SQLite.AutoIncrement]
public int StockTransferArgsId { get; set; }
public long StockItemID { get; set; }
public string Code { get; set; }
public string OperationName { get; set; }
public string Description { get; set; }
public decimal Quantity { get; set; }
public long SourceWarehouseID { get; set; }
public string SourceBinName { get; set; }
public long TargetWarehouseID { get; set; }
public string TargetBinName { get; set; }
public string Reference { get; set; }
public string SecondReference { get; set; }
public string BarCode { get; set; }
public int Status { get; set; }
}