Как я могу заставить NHibernate сделать многоколонный табличный параметр?

Я хотел бы передать табличный параметр (TVP) из двух столбцов в ISQLQuery:

var sql = "INSERT INTO MovieRatings (PersonID, MovieID, Score) " +
          "SELECT :personID, o.movieID, o.score " +
          "FROM :scoreObject o";
var query = session.CreateSQLQuery(sql);
query.SetInt32("personID", fred.ID);
query.SetParameterList("scoreObject", fredsRatings.Select(r => new {
        movieID = r.Movie.ID,
        score = r.Score
    }).ToArray() /*, Optional IType hint here */);
query.ExecuteUpdate();

Когда я делаю это (или пытаюсь намекнуть IType как NHibernateUtil.Object или же NHibernateUtil.Class) NHibernate жалуется:

NHibernate.HibernateException: Не удалось определить тип для класса: <>f__AnonymousType5`2[[System.Int32],[System.String]]

Это также жалуется, если я пытаюсь сделать struct со свойствами для movieID а также score и сделать массив из них вместо анонимных объектов. Единственное, что меняется, это тип, который он "не может определить".

Кажется, Microsoft говорит, что TVP может иметь любые столбцы, которые вы хотите:

Передача табличного параметра в параметризованный оператор SQL

В следующем примере показано, как вставить данные в dbo.Categories таблица с помощью INSERTзаявление сSELECTподзапрос с табличным параметром в качестве источника данных. При передаче табличного параметра в параметризованный оператор SQL необходимо указать имя типа для табличного параметра с помощью новогоTypeName свойство SqlParameter, этоTypeNameдолжен совпадать с именем совместимого типа, ранее созданного на сервере. Код в этом примере используетTypeNameсвойство для ссылки на структуру типа, определенную в dbo.CategoryTableType,

// Assumes connection is an open SqlConnection.  
using (connection)  
{  
    // Create a DataTable with the modified rows.  
    DataTable addedCategories = CategoriesDataTable.GetChanges(  
        DataRowState.Added);  

    // Define the INSERT-SELECT statement.  
    string sqlInsert =   
        "INSERT INTO dbo.Categories (CategoryID, CategoryName)"  
        + " SELECT nc.CategoryID, nc.CategoryName"  
        + " FROM @tvpNewCategories AS nc;"  

    // Configure the command and parameter.  
    SqlCommand insertCommand = new SqlCommand(  
        sqlInsert, connection);  
    SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(  
        "@tvpNewCategories", addedCategories);  
    tvpParam.SqlDbType = SqlDbType.Structured;  
    tvpParam.TypeName = "dbo.CategoryTableType";  

    // Execute the command.  
    insertCommand.ExecuteNonQuery();  
}

Есть ли способ убедить NHibernate сделать TVP с именованными столбцами? Я хотел бы избежать написания моего собственногоIType ,

0 ответов

У Remondo есть новое решение этой проблемы: добавьте определение TVP в транзакцию с помощью SqlParameter из библиотеки Microsoft.

Отредактируйте, чтобы следовать примеру кода для запроса в вопросе.

Другие вопросы по тегам