Доступ к одному полю в foreach с помощью Linq Dapper - PullRequest
0 голосов
/ 26 мая 2019

Я использую 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 enum.

Может быть, мне не хватает объявления о том, какой у меня первичный ключ?

Редактировать 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 ]

2 голосов
/ 26 мая 2019

Вы используете Dapper.Contrib , и это расширение требует, чтобы вы украсили свой класс некоторыми атрибутами, чтобы помочь в автоматической обработке ваших данных.

В частности, для метода обновления необходимо определить атрибут Table и атрибут Key для идентификации первичного ключа

[Table ("BomComps")]
public class BomComponentData
{
   // [ExplictKey]
   [Key]
   public int Sequence { get; set; }
   ....

Здесь, например, я добавил атрибут Таблица , чтобы установить возможное имя таблицы в базе данных, но если имя физической таблицы совпадает с именем класса, вы можете опустить атрибут , Также я добавил атрибут Key , чтобы задать свойство, которое содержит первичный ключ вашей таблицы (чтобы оператор, который обновляет ваши записи, мог быть сформирован с надлежащим условием WHERE).

Обратите внимание, что атрибут Key должен использоваться, если для столбца свойство Identity установлено в значение yes, а если нет, вы используете атрибут ExplicitKey , чтобы сигнализировать, что первичный ключ является определяется вашим кодом.

0 голосов
/ 27 мая 2019

На самом деле это была проблема, с которой мне пришлось украсить свой класс следующим. Оставив это здесь, чтобы у кого-то еще возникла проблема, я использовал библиотеку pcl, но по какой-то причине dapper contribe не обнаружил ключевой элемент, который должен был быть объявлен какследует.

[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; }
}
...