LINQ to SQL SubmitChanges не работает Таблица FILESTREAM - PullRequest
0 голосов
/ 26 октября 2010

У меня есть некоторый код, который вставляет данные в некоторые таблицы (одна таблица имеет столбец FILESTREAM) и затем вызывает SubmitChanges после того, как это сделано.

db.Log = new System.IO.StreamWriter(@"c:\windows\temp\linq.log") { AutoFlush = true };
db.SubmitChanges(ConflictMode.FailOnFirstConflict);

Я ссылался на следующие ссылки, но они не являются моей проблемой:

LINQ to SQL: SubmitChanges () не работает?

LINQ не обновляется .SubmitChanges ()

Каждая таблица имеет первичный ключ. alt text

У меня 14 таблиц, и я вижу 14 IsPrimaryKey = true, содержащееся в linq.designer.cs

Хотя я вижу, что "AutoSync = AutoSync.OnInsert" отсутствует в таблице файлов, но я думаю, что это потому, что 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

Когда я смотрю на Server Profiler, он записывает RPC: Завершено exec sp_executesql "Хорошая инструкция вставки"

Когда я запускаю sql вручную через Server Manager Studio, все работает нормально. Я могу сделать это успешно, войдя в систему с SA или используя учетные данные, используемые веб-службой.

LINQ SubmitChanges не выдает ошибку, хотя. Любая причина, почему это не работает? Я не перегружал никакие функции Insert / Update / DeleteFile ни в каких частичных классах.

Хотя изменение других таблиц работает нормально. Мне интересно, связано ли это со столбцом FILESTREAM.

Моя строка подключения:

Data Source=IP;Initial Catalog=MyDB;User ID=myLogin;Password=myPswd

После того, как я вручную поместил запись в таблицу (таблица FILESTREAM), я могу читать эти данные очень хорошо.

Наконец, у меня есть FILESTREAM, настроенный для доступа Transact-SQL, а не для потокового доступа файлового ввода-вывода. Из того, как я это понял, я не видел необходимости иметь общую папку для расположения данных. Я хотел, чтобы все прошло через базу данных, чтобы добраться до данных FILESTREAM.

Спасибо!

FIXED

У меня есть следующий код:

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

и мои отправки выглядели так:

using (var ts = db.CreateTransactionScope(TransactionScopeOption.RequiresNew, IsolationLevel.ReadUncommitted))
    {
      db.SubmitChanges(ConflictMode.FailOnFirstConflict);
    }

кто-нибудь? кто-нибудь? Я забыл полное утверждение ... лол. Я думал, что мог бы добавить больше в области submitchanges и, возможно, захочу откатить, поэтому я оставил там утверждение using, но никогда не фиксирую свои изменения ... Спасибо всем!

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Я забыл заполненную выписку внутри транзакции

0 голосов
/ 27 октября 2010

Около месяца назад я отправил запрос вставки из кода на сервер sql. И смотрел, абсолютно ничего не произошло. Записи не были вставлены и ошибок не зафиксировано. Профилировщик показал отправляемый запрос. Если бы я выполнил запрос, который имел профилировщик, то это сработало. Абсолютно ошеломил мой разум.

Затем на жаворонке я проверил безопасность. И вот, пользователь, под которым выполнялся сайт, не имеет прав на выполнение вставки. После обновления безопасности все стало работать нормально.

Странно то, что не было абсолютно никакой ошибки. Когда я попытался воспроизвести проблему, я начал получать ошибки безопасности. Я подумал, что SQL-сервер просто решил не сообщать о них в тот день.

Вы можете начать там.

...