使用Linq Dapper

时间:2019-05-26 19:28:34

标签: c# sqlite linq dapper dapper-contrib

我正在使用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,它仍然崩溃。应该如何处理插入?

enter image description here

编辑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中的插入和更新问题。

2 个答案:

答案 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; }
}