Comment puis-je obtenir la colonne d'identité valeur associée à un SubSonic 3 LinqTemplate Insérer?

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

  •  21-09-2019
  •  | 
  •  

Question

J'utilise 3.0.0.3 subsonique avec les modèles T4 Linq. Mon ProjectRepository, par exemple, a les deux méthodes suivantes:

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

En plus d'effectuer l'insertion (qui fonctionne très bien), je voudrais vraiment obtenir la valeur de la colonne ProjectID auto-incrémentée. Pour mémoire, cette colonne est à la fois la clé primaire et de la colonne d'identité. Est-il peut-être un moyen d'ajouter « SELECT SCOPE_IDENTITY (); » à la requête ou peut-être il y a une approche tout à fait différente que je devrais essayer?

Était-ce utile?

La solution

Vous pouvez le faire avec les modèles ActiveRecord qui fait tout le câblage ci-dessus pour vous (et a également intégré des tests). Dans votre scénario, la méthode Add aurait une ligne: Project.Add () et il retournerait le nouveau id

.

Pour vos besoins, vous pouvez essayer ceci:

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

Cela devrait fonctionner ..

* Edition - vous pouvez créer un ExtensionMethod pour cela sur ISqlQuery aussi, pour économiser l'écriture ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top