これには正直ビックリ!別のテーブルに非常によく似たコードがあり、正常に機能します。
Linq to Sql を使用してテーブルに行を挿入していますが、次のいずれかの場合にのみ機能します
- トリガーの一部が無効になっています。
- 合計コスト列 (SQL のお金、C# の 10 進数) を 0 に設定します。
トリガーは、一連の行の総コストを合計し、別のテーブルの総コストを更新します。
トリガーコード
;WITH CalculatedTotals AS
(
SELECT A.ID, SUM(B.TotalCost) AS TotalCost
FROM dbo.TableA A
INNER JOIN dbo.TableB B ON B.GroupID = A.ID
GROUP BY A.ID
)
UPDATE A
SET A.TotalCost = CT.TotalCost
FROM dbo.TableA A
INNER JOIN CalculatedTotals CT ON A.ID = CT.ID
このコードでは、CalculatedTotals.TotalCost は null 許容の int ですが、TableA.TotalCost は null 非許容の金額です。IsNull、Convert などを使用してみました。Linq to Sql を使用すると、常に同じ例外が発生します。ただし、SQL を使用して行を直接挿入すると問題なく動作します。繰り返しますが、機能する別のテーブルを使用した同様のコードがあります。私は.NET 4を使用しています。
どうしたの?
アップデート
InvalidCastException スタック トレース:
at System.Data.SqlClient.SqlBuffer.get_Int64()
at System.Data.SqlClient.SqlDataReader.GetInt64(Int32 i)
at Read_Object(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item)
at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item)
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
at Repository`2.Save() in C:\...\Repository.cs:line 104
at TableBManager.CreateTableB(TableB tableB) in C:\...\TableBManager.cs:line 45
at MyService.SetTableB(TableB tableB) in C:\...\MyService.cs:line 371
at SyncInvokeSetExtraFormItem(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
SubmitChanges
データコンテキストを呼び出そうとすると発生します。
** アップデート **
これは、私が使用する一般的なレポ クラスです。
/// <summary>
/// Creates the item.
/// </summary>
/// <param name="entity">The entity.</param>
public void CreateItem(T entity)
{
_db.GetTable<T>().InsertOnSubmit(entity);
}
/// <summary>
/// Saves this instance.
/// </summary>
public void Save()
{
_db.SubmitChanges();
}
アップデート
わかりましたので、他のコードも機能しなくなりました。変えたのはトリガーだけです。
アップデート
2 つの記事への便利なリンクを含むこの SO の質問を見つけました: Linq-To-SQL Invalid Cast on insert, not on update
バグかもしれません。