Как я могу заставить 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.
Отредактируйте, чтобы следовать примеру кода для запроса в вопросе.