Увеличение атомарного значения в таблице postgres и возвращение старого значения - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть таблица в Postgresql со следующими столбцами:

Id      |     Index

Я хочу реализовать такую ​​функцию, как:

int GetNextIndex(string Id)

Функция будет искать сущность с Id=Id и увеличивать индекс, а затем возвращать старое значение (до обновления). Как я могу атомарно сделать это, используя Entity Framework в C #?

Спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

Я, может быть, сильно упрощаю вашу задачу, но если вам нужна только последовательность, что-то вроде этого должно работать:

public int GetId(string SequenceName)
{
    int result;

    using (NpgsqlConnection conn = new NpgsqlConnection(connectionstring))
    {
        conn.Open();

        using (NpgsqlCommand id = new NpgsqlCommand(string.Format(
            "select nextval('{0}')", SequenceName), conn))
            result = Convert.ToInt32(id.ExecuteScalar());

        conn.Close();
    }

    return result;
}

Вы должны иметь возможность адаптировать это, если у вас есть отдельные объекты подключения и т. Д.

Я могу прыгнуть вперед, но одна из моих любимых функций - это следующая, которая берет коллекцию объектов и присваивает значение каждому полю «Id» в объекте (или какому-либо полю с вашим ID / PK). Возможно, что-то подобное подойдет и для вашей задачи:

public void AssignSequences(string SequenceName, string PropertyName,
    IEnumerable<object> DomainObjects)
{
    using (NpgsqlConnection conn = new NpgsqlConnection(connectionstring))
    {
        conn.Open();
        using (NpgsqlTransaction trans = conn.BeginTransaction())
        {
            using (NpgsqlCommand id = new NpgsqlCommand(string.Format(
                "select nextval('{0}')", SequenceName),
                conn, trans))
            {

                foreach (object o in DomainObjects)
                {
                    PropertyInfo p = o.GetType().GetProperty(PropertyName);
                    p.SetValue(o, Convert.ToInt32(id.ExecuteScalar()));
                }
            }

            trans.Commit();
        }

        conn.Close();
    }
}

Который, если ваше поле Id называется "Id", будет выглядеть примерно так:

AssignSequences("order_line_id", "Id", NewOrders);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...