Perguntas frequentesFrequently Asked Questions

As seções a seguir respondem a alguns problemas comuns que você pode encontrar ao implementar o LINQ.The following sections answer some common issues that you might encounter when you implement LINQ.

Problemas adicionais são abordados na solução de problemas.Additional issues are addressed in Troubleshooting.

Não é Possível ConectarCannot Connect

P.Q. Não consigo me conectar a meu banco de dados.I cannot connect to my database.

R.A. Verifique se a cadeia de conexão está correta e se sua instância de SQL Server está em execução.Make sure your connection string is correct and that your SQL Server instance is running. Observe também que o LINQ to SQLLINQ to SQL exige que o protocolo de pipes nomeados esteja ativado.Note also that LINQ to SQLLINQ to SQL requires the Named Pipes protocol to be enabled. Para obter mais informações, consulte aprendendo por instruções.For more information, see Learning by Walkthroughs.

Alterações perdidas do banco de dadosChanges to Database Lost

P.Q. Fiz uma alteração nos dados no banco de dados, mas, quando executei o aplicativo, a alteração não estava mais lá.I made a change to data in the database, but when I reran my application, the change was no longer there.

R.A. Verifique se você chamou SubmitChanges para salvar os resultados no banco de dados.Make sure that you call SubmitChanges to save results to the database.

Conexão do banco de dados: há quanto tempo está aberta?Database Connection: Open How Long?

P.Q. Quanto tempo a conexão do banco de dados permanece aberta?How long does my database connection remain open?

R.A. Uma conexão geralmente permanece aberta até você consumir os resultados da consulta.A connection typically remains open until you consume the query results. Se você pretende processar todos os resultados e não se opõe a armazenar em cache os resultados, aplique ToList à consulta.If you expect to take time to process all the results and are not opposed to caching the results, apply ToList to the query. Em cenários comuns onde cada objeto é processado somente uma vez, o modelo de streaming é superior no DataReader e no LINQ to SQLLINQ to SQL.In common scenarios where each object is processed only one time, the streaming model is superior in both DataReader and LINQ to SQLLINQ to SQL.

Os detalhes exatos do uso da conexão dependem do seguinte:The exact details of connection usage depend on the following:

Atualizar sem consultarUpdating Without Querying

P.Q. Posso atualizar os dados da tabela sem primeiro consultar o banco de dados?Can I update table data without first querying the database?

R.A. Embora o LINQ to SQLLINQ to SQL não tenha comandos de atualização baseados em conjunto, você pode usar qualquer uma das seguintes técnicas para atualizar sem consultar primeiro:Although LINQ to SQLLINQ to SQL does not have set-based update commands, you can use either of the following techniques to update without first querying:

  • Use ExecuteCommand para enviar o código SQL.Use ExecuteCommand to send SQL code.

  • Crie uma nova instância do objeto e inicialize todos os valores atuais (campos) que afetam a atualização.Create a new instance of the object and initialize all the current values (fields) that affect the update. Anexe o objeto ao DataContext usando Attach e modifique o campo que você deseja alterar.Then attach the object to the DataContext by using Attach and modify the field you want to change.

Resultados inesperados da consultaUnexpected Query Results

P.Q. Minha consulta está retornando resultados inesperados.My query is returning unexpected results. Como posso inspecionar o que está ocorrendo?How can I inspect what is occurring?

R.A. O LINQ to SQLLINQ to SQL fornece várias ferramentas para inspecionar o código SQL que produz.LINQ to SQLLINQ to SQL provides several tools for inspecting the SQL code it generates. Um dos mais importantes é Log.One of the most important is Log. Para obter mais informações, consulte depuração de suporte.For more information, see Debugging Support.

Resultados inesperados de procedimentos armazenadosUnexpected Stored Procedure Results

P.Q. Tenho um procedimento armazenado cujo valor de retorno é calculado por MAX().I have a stored procedure whose return value is calculated by MAX(). Quando arrasto o procedimento armazenado para a superfície o/R Designer, o valor de retorno não está correto.When I drag the stored procedure to the O/R Designer surface, the return value is not correct.

R.A. O LINQ to SQLLINQ to SQL fornece duas maneiras de retornar valores gerados por banco de dados por meio de procedimentos armazenados:LINQ to SQLLINQ to SQL provides two ways to return database-generated values by way of stored procedures:

  • Nomeando o resultado de saída.By naming the output result.

  • Especificando explicitamente um parâmetro de saída.By explicitly specifying an output parameter.

O código a seguir é um exemplo de saída incorreta.The following is an example of incorrect output. Como o LINQ to SQLLINQ to SQL não pode mapear os resultados, ele sempre retorna 0:Because LINQ to SQLLINQ to SQL cannot map the results, it always returns 0:

create procedure proc2

as

begin

select max(i) from t where name like 'hello'

end

O código a seguir é um exemplo de saída correta usando um parâmetro de saída:The following is an example of correct output by using an output parameter:

create procedure proc2

@result int OUTPUT

as

select @result = MAX(i) from t where name like 'hello'

go

O código a seguir é um exemplo de saída correta nomeando o resultado de saída:The following is an example of correct output by naming the output result:

create procedure proc2

as

begin

select nax(i) AS MaxResult from t where name like 'hello'

end

Para obter mais informações, consulte Personalizando operações usando procedimentos armazenados.For more information, see Customizing Operations By Using Stored Procedures.

Erros de serializaçãoSerialization Errors

P.Q. Quando tento serializar, obtenho o seguinte erro: "tipo ' System. Data. Linq. ChangeTracker + StandardChangeTracker '... Não está marcado como serializável. "When I try to serialize, I get the following error: "Type 'System.Data.Linq.ChangeTracker+StandardChangeTracker' ... is not marked as serializable."

R.A. A geração de código no LINQ to SQLLINQ to SQL dá suporte à serialização do DataContractSerializer.Code generation in LINQ to SQLLINQ to SQL supports DataContractSerializer serialization. Ela não dá suporte a XmlSerializer ou BinaryFormatter.It does not support XmlSerializer or BinaryFormatter. Para obter mais informações, consulte Serialização.For more information, see Serialization.

Vários arquivos DBMLMultiple DBML Files

P.Q. Quando eu tenho vários arquivos DBML que compartilham algumas tabelas em comum, eu obtenho um erro do compilador.When I have multiple DBML files that share some tables in common, I get a compiler error.

R.A. Defina o namespace de contexto e as propriedades de namespace de entidade do Object Relational Designer para um valor distinto para cada arquivo dbml.Set the Context Namespace and Entity Namespace properties from the Object Relational Designer to a distinct value for each DBML file. Essa abordagem elimina a colisão nome/namespace.This approach eliminates the name/namespace collision.

Evitando a configuração explícita de valores gerados por banco de dados em Insert ou UpdateAvoiding Explicit Setting of Database-Generated Values on Insert or Update

P.Q. Tenho uma tabela de banco de dados com uma coluna DateCreated que usa como padrão o Getdate() do SQL.I have a database table with a DateCreated column that defaults to SQL Getdate(). Quando tento inserir um novo registro usando o LINQ to SQLLINQ to SQL, o valor é definido como NULL.When I try to insert a new record by using LINQ to SQLLINQ to SQL, the value gets set to NULL. Eu gostaria que ele fosse definido como o padrão do banco de dados.I would expect it to be set to the database default.

R.A. O LINQ to SQLLINQ to SQL trata essa situação automaticamente para colunas de identidade (incremento automático) e rowguidcol (GUID gerado por banco de dados) e carimbo de data/hora.LINQ to SQLLINQ to SQL handles this situation automatically for identity (auto-increment) and rowguidcol (database-generated GUID) and timestamp columns. Em outros casos, você deve definir manualmente IsDbGenerated=true e AutoSync=Always/OnInsert/OnUpdate Propriedades.In other cases, you should manually set IsDbGenerated=true and AutoSync=Always/OnInsert/OnUpdate properties.

Vários DataLoadOptionsMultiple DataLoadOptions

P.Q. Posso especificar opções de carregamento adicionais sem substituir as primeiras?Can I specify additional load options without overwriting the first?

R.A. Sim.Yes. A primeira não é substituída, como no exemplo a seguir:The first is not overwritten, as in the following example:

Dim dlo As New DataLoadOptions()
dlo.LoadWith(Of Order)(Function(o As Order) o.Customer)
dlo.LoadWith(Of Order)(Function(o As Order) o.OrderDetails)
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Order>(o => o.Customer);
dlo.LoadWith<Order>(o => o.OrderDetails);

Erros ao usar o SQL Compact 3.5Errors Using SQL Compact 3.5

P.Q. Recebo um erro quando arrasto tabelas de um banco de dados SQL Server Compact 3,5.I get an error when I drag tables out of a SQL Server Compact 3.5 database.

R.A. O Object Relational Designer não oferece suporte a SQL Server Compact 3,5, embora o tempo de execução do LINQ to SQLLINQ to SQL faça isso.The Object Relational Designer does not support SQL Server Compact 3.5, although the LINQ to SQLLINQ to SQL runtime does. Nesta situação, você deve criar suas próprias classes de entidade e adicionar os atributos apropriados.In this situation, you must create your own entity classes and add the appropriate attributes.

Erros nas relações de herançaErrors in Inheritance Relationships

P.Q. Usei a forma de herança da caixa de ferramentas no Object Relational Designer para conectar duas entidades, mas recebo erros.I used the toolbox inheritance shape in the Object Relational Designer to connect two entities, but I get errors.

R.A. Criar a relação não é suficiente.Creating the relationship is not enough. Você deve fornecer informações como a coluna do discriminador, o valor do discriminador da classe base e o valor do discriminador da classe derivada.You must provide information such as the discriminator column, base class discriminator value, and derived class discriminator value.

Modelo do provedorProvider Model

P.Q. Um modelo de provedor público está disponível?Is a public provider model available?

R.A. Nenhum modelo de provedor público está disponível.No public provider model is available. Neste momento, LINQ to SQLLINQ to SQL dá suporte apenas a SQL Server e SQL Server Compact 3,5.At this time, LINQ to SQLLINQ to SQL supports SQL Server and SQL Server Compact 3.5 only.

Ataques de injeção de SQLSQL-Injection Attacks

P.Q. Como o LINQ to SQLLINQ to SQL é protegido contra ataques de injeção de SQL?How is LINQ to SQLLINQ to SQL protected from SQL-injection attacks?

R.A. A injeção de SQL tem sido um risco significativo para consultas tradicionais de SQL formadas por meio da concatenação da entrada do usuário.SQL injection has been a significant risk for traditional SQL queries formed by concatenating user input. O LINQ to SQLLINQ to SQL evita essa injeção usando o SqlParameter em consultas.LINQ to SQLLINQ to SQL avoids such injection by using SqlParameter in queries. A entrada do usuário é transformada em valores de parâmetro.User input is turned into parameter values. Essa abordagem impede que os comandos mal-intencionados sejam usados da entrada do cliente.This approach prevents malicious commands from being used from customer input.

Alterando o sinalizador somente leitura em arquivos DBMLChanging Read-only Flag in DBML Files

P.Q. Como posso eliminar configuradores de algumas propriedades quando crio um modelo de objeto de um arquivo DBML?How do I eliminate setters from some properties when I create an object model from a DBML file?

R.A. Siga as etapas a seguir para este cenário avançado:Take the following steps for this advanced scenario:

  1. No arquivo .dbml, modifique a propriedade alterando o sinalizador do IsReadOnly para True.In the .dbml file, modify the property by changing the IsReadOnly flag to True.

  2. Adicione uma classe parcial.Add a partial class. Crie um construtor com parâmetros para os membros somente leitura.Create a constructor with parameters for the read-only members.

  3. Examine o valor padrão UpdateCheck (Never) para determinar se este é o valor correto para seu aplicativo.Review the default UpdateCheck value (Never) to determine whether that is the correct value for your application.

    Cuidado

    Se você estiver usando o Object Relational Designer no Visual Studio, suas alterações poderão ser substituídas.If you are using the Object Relational Designer in Visual Studio, your changes might be overwritten.

APTCAAPTCA

P.Q. O System.Data.Linq está marcado para ser usado pelo código parcialmente confiável?Is System.Data.Linq marked for use by partially trusted code?

R.A. Sim, o assembly System. Data. Linq. dll está entre aqueles .NET Framework assemblies marcados com o atributo AllowPartiallyTrustedCallersAttribute.Yes, the System.Data.Linq.dll assembly is among those .NET Framework assemblies marked with the AllowPartiallyTrustedCallersAttribute attribute. Sem essa marcação, os assemblies no .NET Framework destinam-se ao uso somente por código totalmente confiável.Without this marking, assemblies in the .NET Framework are intended for use only by fully trusted code.

O cenário principal no LINQ to SQLLINQ to SQL para permitir chamadores parcialmente confiáveis é permitir que o assembly LINQ to SQLLINQ to SQL seja acessado de aplicativos Web, onde a configuração de confiança é média.The principal scenario in LINQ to SQLLINQ to SQL for allowing partially trusted callers is to enable the LINQ to SQLLINQ to SQL assembly to be accessed from Web applications, where the trust configuration is Medium.

Dados de mapeamento de várias tabelasMapping Data from Multiple Tables

P.Q. Os dados na minha entidade vêm de várias tabelas.The data in my entity comes from multiple tables. Como posso mapeá-los?How do I map it?

R.A. Você pode criar uma exibição em um banco de dados e mapear a entidade para a exibição.You can create a view in a database and map the entity to the view. O LINQ to SQLLINQ to SQL gera o mesmo SQL para exibições da mesma forma que faz para tabelas.LINQ to SQLLINQ to SQL generates the same SQL for views as it does for tables.

Observação

O uso de exibições nesse cenário tem limitações.The use of views in this scenario has limitations. Essa abordagem funciona com mais segurança quando as operações realizadas no Table<TEntity> têm suporte pela exibição subjacente.This approach works most safely when the operations performed on Table<TEntity> are supported by the underlying view. Somente você sabe quais operações são desejadas.Only you know which operations are intended. Por exemplo, a maioria dos aplicativos são somente leitura e outro número de considerável executa Create/Update/operações de Delete apenas usando procedimentos armazenados em exibições.For example, most applications are read-only, and another sizeable number perform Create/Update/Delete operations only by using stored procedures against views.

Pool de conexõesConnection Pooling

P.Q. Há uma construção que possa ajudar com o pool de DataContext?Is there a construct that can help with DataContext pooling?

R.A. Não tente reutilizar instâncias do DataContext.Do not try to reuse instances of DataContext. Cada DataContext mantém o estado (incluindo um cache de identidade) para uma determinada sessão de edição/consulta.Each DataContext maintains state (including an identity cache) for one particular edit/query session. Para obter as novas instâncias com base no estado atual do banco de dados, use um novo DataContext.To obtain new instances based on the current state of the database, use a new DataContext.

Você ainda pode usar o pool de conexões ADO.NET subjacente.You can still use underlying ADO.NET connection pooling. Para obter mais informações, confira Pooling de conexão do SQL Server (ADO.NET).For more information, see SQL Server Connection Pooling (ADO.NET).

O segundo DataContext não é atualizadoSecond DataContext Is Not Updated

P.Q. Eu usei uma instância do DataContext para armazenar valores no banco de dados.I used one instance of DataContext to store values in the database. No entanto, um segundo DataContext no mesmo banco de dados não reflete os valores atualizados.However, a second DataContext on the same database does not reflect the updated values. A segunda instância do DataContext parece retornar os valores armazenados em cache.The second DataContext instance seems to return cached values.

R.A. Esse comportamento é padrão.This behavior is by design. O LINQ to SQLLINQ to SQL continua a retornar as mesmas instâncias/valores que você viu na primeira instância.LINQ to SQLLINQ to SQL continues to return the same instances/values that you saw in the first instance. Quando você faz atualizações, usa a simultaneidade otimista.When you make updates, you use optimistic concurrency. Os dados originais são usados para verificar o estado atual do banco de dados e declarar que ainda estão de fato inalterados.The original data is used to check against the current database state to assert that it is in fact still unchanged. Se eles forem alterados, um conflito ocorre e seu aplicativo deve resolvê-lo.If it has changed, a conflict occurs and your application must resolve it. Uma opção do aplicativo é redefinir o estado original para o estado atual do banco de dados e tentar novamente a atualização.One option of your application is to reset the original state to the current database state and to try the update again. Para obter mais informações, consulte como: gerenciar conflitos de alteração.For more information, see How to: Manage Change Conflicts.

Você também pode definir o ObjectTrackingEnabled como falso, o que desativa o cache e o controle de alterações.You can also set ObjectTrackingEnabled to false, which turns off caching and change tracking. Você pode então recuperar os valores mais recentes toda vez que consultar.You can then retrieve the latest values every time that you query.

Não é possível chamar SubmitChanges no modo somente leituraCannot Call SubmitChanges in Read-only Mode

P.Q. Quando eu tento chamar SubmitChanges no modo somente leitura, obtenho um erro.When I try to call SubmitChanges in read-only mode, I get an error.

R.A. O modo somente leitura desativa a capacidade de o contexto controlar as alterações.Read-only mode turns off the ability of the context to track changes.

Veja tambémSee also