Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Esta explicação demonstra como adicionar uma consulta definidora e um tipo de entidade correspondente a um modelo usando o EF Designer. Uma consulta definidora é comumente usada para fornecer funcionalidades semelhantes às fornecidas por uma vista de base de dados, mas a vista é definida no modelo, não na base de dados. Uma consulta definidora permite-lhe executar uma instrução SQL especificada no elemento DefiningQuery de um ficheiro .edmx. Para mais informações, consulte DefiningQuery na Especificação SSDL.
Ao usar consultas definidoras, também tem de definir um tipo de entidade no seu modelo. O tipo de entidade é usado para revelar dados expostos pela consulta definidora. Note que os dados emergidos através deste tipo de entidade são apenas de leitura.
Consultas parametrizadas não podem ser executadas como consultas definidoras. No entanto, os dados podem ser atualizados mapeando as funções de inserção, atualização e eliminação do tipo de entidade que apresenta os dados para procedimentos armazenados. Para mais informações, consulte Inserir, Atualizar e Eliminar com Procedimentos Armazenados.
Este tópico mostra como realizar as seguintes tarefas.
- Adicionar uma Consulta Definidora
- Adicionar um Tipo de Entidade ao Modelo
- Mapear a consulta definidora para o tipo de entidade
Pré-requisitos
Para completar esta explicação, vai precisar de:
- Uma versão recente do Visual Studio.
- A base de dados de exemplos da escola.
Criar o Projeto
Esta guia está a usar Visual Studio 2012 ou versão mais recente.
- Abre o Visual Studio.
- No menu Arquivo , aponte para Novo e clique em Projeto.
- No painel esquerdo, clique em Visual C# e depois selecione o modelo de Aplicação de Consola .
- Introduza DefiningQuerySample como o nome do projeto e clique em OK.
Criar um Modelo baseado na Base de Dados da Escola
Clique com o botão direito no nome do projeto no Explorador de Soluções, aponte para Adicionar e depois clique em Novo Item.
Selecione Dados no menu esquerdo e depois selecione ADO.NET Modelo de Dados de Entidade no painel de Modelos.
Introduza DefiningQueryModel.edmx para o nome do ficheiro e depois clique em Adicionar.
Na caixa de diálogo Escolher Conteúdo do Modelo, selecione Gerar a partir da base de dados e depois clique em Próximo.
Clique em Nova Ligação. Na caixa de diálogo Propriedades da Ligação, introduza o nome do servidor (por exemplo, (localdb)\mssqllocaldb), selecione o método de autenticação, escreva School para o nome da base de dados e depois clique em OK. A caixa de diálogo Escolha a Sua Ligação de Dados é atualizada com as definições de ligação à base de dados.
Na caixa de diálogo Escolher Seus Objetos de Base de Dados, marque o nó Tabelas. Isto vai adicionar todas as tabelas ao modelo da Escola .
Clique em Concluir.
No Explorador de Soluções, clique com o botão direito no ficheiro DefiningQueryModel.edmx e selecione Abrir Com....
Selecione XML (Editor de Texto).
Clique em Sim se for solicitado com a seguinte mensagem:
Adicionar uma Consulta Definidora
Neste passo, vamos usar o XML Editor para adicionar uma consulta definidora e um tipo de entidade à secção SSDL do ficheiro .edmx.
- Adicione um elemento EntitySet à secção SSDL do ficheiro .edmx (linha 5 a 13). Especifique o seguinte:
- Apenas os atributos Name e EntityType do elemento EntitySet são especificados.
- O nome totalmente qualificado do tipo de entidade é usado no atributo EntityType .
- A instrução SQL a executar é especificada no elemento DefiningQuery .
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityContainer Name="SchoolModelStoreContainer">
<EntitySet Name="GradeReport" EntityType="SchoolModel.Store.GradeReport">
<DefiningQuery>
SELECT CourseID, Grade, FirstName, LastName
FROM StudentGrade
JOIN
(SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
ON StudentID = p.PersonID
</DefiningQuery>
</EntitySet>
<EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" />
- Adicione o elemento EntityType à secção SSDL do .edmx. arquivo conforme mostrado abaixo. Observe o seguinte:
- O valor do atributo Name corresponde ao valor do atributo EntityType no elemento EntitySet acima, embora o nome totalmente qualificado do tipo de entidade seja usado no atributo EntityType .
- Os nomes das propriedades correspondem aos nomes das colunas devolvidos pela instrução SQL no elemento DefiningQuery (acima).
- Neste exemplo, a chave de entidade é composta por três propriedades para garantir um valor de chave único.
<EntityType Name="GradeReport">
<Key>
<PropertyRef Name="CourseID" />
<PropertyRef Name="FirstName" />
<PropertyRef Name="LastName" />
</Key>
<Property Name="CourseID"
Type="int"
Nullable="false" />
<Property Name="Grade"
Type="decimal"
Precision="3"
Scale="2" />
<Property Name="FirstName"
Type="nvarchar"
Nullable="false"
MaxLength="50" />
<Property Name="LastName"
Type="nvarchar"
Nullable="false"
MaxLength="50" />
</EntityType>
Observação
Se mais tarde abrir o diálogo Update Model Wizard , quaisquer alterações feitas ao modelo de armazenamento, incluindo a definição de consultas, serão sobrescrevidas.
Adicionar um Tipo de Entidade ao Modelo
Neste passo, iremos adicionar o tipo de entidade ao modelo conceptual usando o EF Designer. Tenha em atenção o seguinte:
- O nome da entidade corresponde ao valor do atributo EntityType no elemento EntitySet acima.
- Os nomes das propriedades correspondem aos nomes das colunas retornados pela instrução SQL no elemento DefiningQuery acima.
- Neste exemplo, a chave de entidade é composta por três propriedades para garantir um valor de chave único.
Abra o modelo no EF Designer.
Clique duas vezes no DefiningQueryModel.edmx.
Diga Sim à seguinte mensagem:
O Designer de Entidades, que fornece uma superfície de design para editar o seu modelo, é exibido.
- Clique com o botão direito na superfície do designer e selecione Adicionar Nova>....
- Especifique o GradeReport para o nome da entidade e o CourseID para a Propriedade Chave.
- Clique com o botão direito na entidade GradeReport e selecione Adicionar Novo>Propriedade Escalar.
- Muda o nome padrão da propriedade para FirstName.
- Adicione outra propriedade escalar e especifique Apelido para o nome.
- Adicione outra propriedade escalar e especifique Grade para o nome.
- Na janela de Propriedades, altere a propriedade de Tipo da Grade para Decimal.
- Selecione as propriedades Primeiro Nome e Apelido .
- Na janela de Propriedades , altere o valor da propriedade EntityKey para True.
Como resultado, os seguintes elementos foram adicionados à secção CSDL do ficheiro .edmx.
<EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />
<EntityType Name="GradeReport">
. . .
</EntityType>
Mapear a consulta definidora para o tipo de entidade
Neste passo, usaremos a janela de Detalhes de Mapeamento para mapear os tipos de entidades conceptuais e de armazenamento.
- Clique com o botão direito na entidade GradeReport na superfície de design e selecione Mapeamento de Tabela.
É exibida a janela de Detalhes do Mapeamento . -
Selecione GradeReport na <lista suspensa Adicionar uma Tabela ou Visualização> (localizada nas Tabelas).
Aparecem mapeamentos padrão entre o tipo de entidade GradeReport conceptual e de armazenamento.
Como resultado, o elemento EntitySetMapping é adicionado à secção de mapeamento do ficheiro .edmx.
<EntitySetMapping Name="GradeReports">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
<MappingFragment StoreEntitySet="GradeReport">
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Grade" ColumnName="Grade" />
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
- Compila a aplicação.
Chame a Consulta Definidora no seu Código
Agora pode executar a consulta definidora usando o tipo de entidade GradeReport.
using (var context = new SchoolEntities())
{
var report = context.GradeReports.FirstOrDefault();
Console.WriteLine("{0} {1} got {2}",
report.FirstName, report.LastName, report.Grade);
}