Como posso obter o valor da coluna de identidade associado a uma inserção subsônica de 3 linqtemplate?

StackOverflow https://stackoverflow.com/questions/1576451

  •  21-09-2019
  •  | 
  •  

Pergunta

Estou usando o subsônico 3.0.0.3 junto com os modelos LINQ T4. Meu projectrepository, por exemplo, tem os dois métodos a seguir:

public int Add(Project item)
{
    int result = 0;
    ISqlQuery query = BuildInsertQuery(item);

    if (query != null)
    {
       result = query.Execute();
    }
    return result;
}

private ISqlQuery BuildInsertQuery(Project item)
{
    ITable tbl = FindTableByClassName();

    Insert query = null;
    if (tbl != null)
    {
        Dictionary<string, object> hashed = item.ToDictionary();
        query = new Insert(_db.Provider).Into<Project>(tbl);

        foreach (string key in hashed.Keys)
        {
            IColumn col = tbl.GetColumn(key);
            if (col != null)
            {
                if (!col.AutoIncrement)
                {
                    query.Value(key, hashed[key]);
                }
            }
        }
    }

    return query;
}

Juntamente com a execução da inserção (que funciona muito bem), eu realmente gostaria de obter o valor da coluna ProjectId de incrementação automática. Para o registro, esta coluna é a chave primária e a coluna de identidade. Talvez exista uma maneira de anexar "select scope_identity ();" para a consulta ou talvez haja uma abordagem totalmente diferente que eu deveria tentar?

Foi útil?

Solução

Você pode fazer isso com os modelos ActiveRecord, que fazem toda a fiação acima para você (e também tem testes internos). No seu cenário, o método Add teria uma linha: Project.add () e retornaria o novo ID.

Para suas necessidades, você pode tentar o seguinte:

var cmd=query.GetCommand();
cmd.CommandSql+=";SELECT SCOPE_IDENTITY() as newid";
var newID=query.Provider.ExecuteScalar(cmd);

Isso deve funcionar ..

*EDIT - Você também pode criar um método de extensão para isso no ISQLQLQUERY, para salvar alguns escritos ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top