いくつかのテーブルにデータを挿入し(1つのテーブルにはFILESTREAM列があります)、完了後にSubmitChangesを呼び出すコードがあります。
db.Log = new System.IO.StreamWriter(@"c:\windows\temp\linq.log") { AutoFlush = true };
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
次のリンクを参照しましたが、問題ではないようです。
LINQ to SQL:SubmitChanges()が機能しませんか?
各テーブルには主キーがあります。
14個のテーブルがあり、linq.designer.csに14個のIsPrimaryKey=trueが含まれていることがわかります。
「AutoSync=AutoSync.OnInsert」がFilesテーブルにないことはわかりますが、これはIDENTITYが設定されていないためだと思います(主キーとしてguidを使用)。
データベースを確認したところ、何も挿入されていませんでした。linq.logは次のことを示しています。
INSERT INTO [dbo].[Files]([fileID], [FileContents], [dteCreated], [dteLastModified], [txtDesc], [mimeID], [txtName], [txtTitle], [dteDeleted])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [92190315-1107-4848-94b3-dd9badf4465b]
-- @p1: Input VarBinary (Size = -1; Prec = 0; Scale = 0) [SqlBinary(24064)]
-- @p2: Input DateTime2 (Size = -1; Prec = 0; Scale = 0) [10/26/2010 1:54:55 PM]
-- @p3: Input DateTime2 (Size = -1; Prec = 0; Scale = 0) [10/26/2010 1:54:55 PM]
-- @p4: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [This is my new file]
-- @p5: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- @p6: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [MySecondTestDoc.doc]
-- @p7: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [My Other Test Document]
-- @p8: Input DateTime2 (Size = -1; Prec = 0; Scale = 0) []
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
INSERT INTO [dbo].[UserFiles]([fileID], [userID], [rightsID])
VALUES (@p0, @p1, @p2)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input UniqueIdentifier (Size = -1; Prec = 0; Scale = 0) [92190315-1107-4848-94b3-dd9badf4465b]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
サーバープロファイラーを見ると、RPC:Completed exec sp_executesql "GoodInsertStatement"が記録されています。
Server Manager Studioを介してSQLを手動で実行すると、すべてが正常に機能します。SAまたはWebサービスで使用されるクレデンシャルを使用してログインすることで、これを正常に実行できます。
ただし、LINQSubmitChangesはエラーをスローしません。それが機能しない理由は何ですか?部分クラスのInsert/Update/DeleteFile関数をオーバーロードしていません。
ただし、他のテーブルの変更は正常に機能しているようです。FILESTREAM列と関係があるのだろうかと思います。
私の接続文字列は次のとおりです。
Data Source=IP;Initial Catalog=MyDB;User ID=myLogin;Password=myPswd
レコードをテーブル(FILESTREAMテーブル)に手動で配置すると、そのデータを正常に読み取ることができます。
最後に、ファイルI / Oストリーミングアクセスではなく、Transact-SQLアクセス用にFILESTREAMを構成しました。私がそれを理解した方法から、データの場所に共有フォルダーを用意する必要はないと思いました。FILESTREAMデータに到達するために、すべてがデータベースを通過するようにしたかったのです。
ありがとう!
修繕
私は次のコードを持っています:
public TransactionScope CreateTransactionScope(TransactionScopeOption scope, IsolationLevel level)
{
var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = level;
transactionOptions.Timeout = TimeSpan.MaxValue;
return new TransactionScope(scope, transactionOptions);
}
public TransactionScope CreateTransactionScope(TransactionScopeOption scope)
{
return CreateTransactionScope(scope, IsolationLevel.ReadCommitted);
}
そして私のsubmitchangesは次のようになりました:
using (var ts = db.CreateTransactionScope(TransactionScopeOption.RequiresNew, IsolationLevel.ReadUncommitted))
{
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
}
誰でも?誰でも?私は完全な声明を忘れました...笑。submitchanges領域にさらに追加し、ロールバックしたいと思っていたので、usingステートメントをそこに残しましたが、変更をコミットすることはありません...みんなありがとう!