Pergunta

Eu tenho algum código que insere dados em algumas tabelas (uma tabela possui uma coluna FILESTREAM) e depois chama submitchanges após a conclusão.

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

Eu referenciei os seguintes links, mas eles parecem não ser meu problema:

Linq para SQL: Submitchanges () não funciona?

Linq não está atualizando sobre .submitchanges ()

Cada tabela possui uma chave primária.alt text

Eu tenho 14 tabelas e vejo 14 isPrimaryKey = true contido no linq.designer.cs

Embora eu veja que "AUTOSYNC = AUTOSYNC.ONININERST" está ausente na tabela de arquivos, mas acho que é porque a identidade não está definida (usando o GUID como chave primária).

Quando verifico o banco de dados, nada foi inserido nele. O Linq.log mostra:

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

Quando olho para o servidor Profiler, ele registra RPC: Concluído EXEC sp_executesql "boa instrução inserir"

Quando eu corro o SQL manualmente através do Server Manager Studio, tudo funciona bem. Eu posso fazer isso com sucesso, fazendo login com SA ou com as credenciais usadas pelo serviço da web.

O Linq Submitchanges não está lançando um erro. Alguma razão para não estar funcionando? Não sobrecarreguei nenhuma função de inserção/atualização/deletefile em nenhuma classe parcial.

Modificar outras tabelas parecem funcionar bem. Gostaria de saber se isso tem a ver com a coluna FileStream.

Minha string de conexão é:

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

Depois de colocar o registro manualmente na tabela (tabela FileStream), posso ler esses dados muito bem.

Por fim, eu tenho o Filestream configurado para acesso Transact-SQL e não para acesso de E/S de arquivo. De como eu entendi, não vi uma necessidade de ter uma pasta compartilhada no local dos dados. Eu queria que tudo passasse pelo banco de dados para acessar os dados do Filestream.

Obrigado!

FIXO

Eu tenho o seguinte código:

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

E meus submitchanges pareciam:

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

alguém? alguém? Eu esqueci a declaração completa ... lol. Eu estava pensando que poderia adicionar mais na área de submitchanges e poderia querer reverter para deixar a declaração de uso lá, mas nunca comprometa minhas mudanças ... obrigado a todos!

Foi útil?

Solução

Esqueci a declaração completa dentro da transação

Outras dicas

Cerca de um mês atrás, enviei uma consulta de inserção do código para o servidor SQL. E assisti absolutamente nada acontecer. Nenhum registro foi inserido e nenhum erro registrado. Profiler mostrou a consulta sendo enviada. Se eu executasse a consulta que o Profiler tinha, funcionou. Absolutamente confuso minha mente.

Então, em uma brincadeira, verifiquei a segurança. E eis que o usuário em que o site estava executando não possuía permissões para executar a inserção. Depois de atualizar a segurança, tudo começou a funcionar bem.

A coisa estranha é que absolutamente nenhum erro foi lançado. Quando tentei replicar o problema, comecei a obter erros de segurança. Imaginei que o SQL Server apenas decidiu não relatar nenhum naquele dia.

Você pode começar por aí.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top