以原子方式递增postgres表中的值并返回旧值

时间:2018-11-02 01:00:48

标签: c# postgresql entity-framework

我在Postgresql中有一个带有以下列的表:

Id      |     Index

我想实现一个像这样的功能

int GetNextIndex(string Id)

该函数将使用Id=Id查找实体,并递增Index,然后返回旧值(更新前)。如何使用C#中的Entity Framework自动执行此操作?

谢谢!

1 个答案:

答案 0 :(得分:0)

我可能会过于简化您的任务,但是如果您只想要序列,那么应该可以执行以下操作:

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);