F. Using an .edmx File
An .edmx file is an XML file that defines an Entity Data Model (EDM), describes the target database schema, and defines the mapping between the EDM and the database. An .edmx file also contains information that is used by the ADO.NET Entity Data Model Designer (Entity Designer) to render a model graphically.
The following code examples illustrate the necessary changes to the .edmx file in order to provide Extended Entity Framework functionality to the EDM layer.
The Entity Framework includes a set of methods similar to those of ADO.NET. These methods have been tailored to be useful for the new Entity Framework consumers – LINQ, EntitySQL, and ObjectServices.
The ADO.NET Entity Framework data provider models this functionality in the EDM by surfacing the PsqlStatus and PsqlConnectionStatistics entities, allowing you to model this functionality using standard tools in Visual Studio.
Code Examples
The following code fragment is an example of the SSDL model:
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="EntityModel.Store" Alias="Self"
xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"
Provider=Pervasive.Data.SqlClient"
ProviderManifestToken="PSQL">
<EntityContainer Name="SampleStoreContainer">
<EntitySet Name="Connection_Statistics"
EntityType="EntityModel.Store.Connection_Statistics" />
<EntitySet Name="Status" EntityType="EntityModel.Store.Status" />
</EntityContainer>
<Function Name="RetrieveStatistics" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName=""Psql_Connection_RetrieveStatistics"" />
<Function Name="EnableStatistics" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName=""Psql_Connection_EnableStatistics"" />
<Function Name="DisableStatistics" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName=""Psql_Connection_DisableStatistics"" />
<Function Name="ResetStatistics" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName=""Psql_Connection_ResetStatistics"" />
</Function>
<EntityType Name="Connection_Statistics">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="SocketReadTime" Type="double" Nullable="false" />
<Property Name="MaxSocketReadTime" Type="double" Nullable="false" />
<Property Name="SocketReads" Type="bigint" Nullable="false" />
<Property Name="BytesReceived" Type="bigint" Nullable="false" />
<Property Name="MaxBytesPerSocketRead" Type="bigint" Nullable="false" />
<Property Name="SocketWriteTime" Type="double" Nullable="false" />
<Property Name="MaxSocketWriteTime" Type="double" Nullable="false" />
<Property Name="SocketWrites" Type="bigint" Nullable="false" />
<Property Name="BytesSent" Type="bigint" Nullable="false" />
<Property Name="MaxBytesPerSocketWrite" Type="bigint" Nullable="false" />
<Property Name="TimeToDisposeOfUnreadRows" Type="double" Nullable="false" />
<Property Name="SocketReadsToDisposeUnreadRows" Type="bigint" Nullable="false" />
<Property Name="BytesRecvToDisposeUnreadRows" Type="bigint" Nullable="false" />
<Property Name="IDUCount" Type="bigint" Nullable="false" />
<Property Name="SelectCount" Type="bigint" Nullable="false" />
<Property Name="StoredProcedureCount" Type="bigint" Nullable="false" />
<Property Name="DDLCount" Type="bigint" Nullable="false" />
<Property Name="PacketsReceived" Type="bigint" Nullable="false" />
<Property Name="PacketsSent" Type="bigint" Nullable="false" />
<Property Name="ServerRoundTrips" Type="bigint" Nullable="false" />
<Property Name="SelectRowsRead" Type="bigint" Nullable="false" />
<Property Name="StatementCacheHits" Type="bigint" Nullable="false" />
<Property Name="StatementCacheMisses" Type="bigint" Nullable="false" />
<Property Name="StatementCacheReplaces" Type="bigint" Nullable="false" />
<Property Name="StatementCacheTopHit1" Type="bigint" Nullable="false" />
<Property Name="StatementCacheTopHit2" Type="bigint" Nullable="false" />
<Property Name="StatementCacheTopHit3" Type="bigint" Nullable="false" />
<Property Name="PacketsReceivedPerSocketRead" Type="double" Nullable="false" />
<Property Name="BytesReceivedPerSocketRead" Type="double" Nullable="false" />
<Property Name="PacketsSentPerSocketWrite" Type="double" Nullable="false" />
<Property Name="BytesSentPerSocketWrite" Type="double" Nullable="false" />
<Property Name="PacketsSentPerRoundTrip" Type="double" Nullable="false" />
<Property Name="PacketsReceivedPerRoundTrip" Type="double" Nullable="false" />
<Property Name="BytesSentPerRoundTrip" Type="double" Nullable="false" />
<Property Name="BytesReceivedPerRoundTrip" Type="double" Nullable="false" />
<Property Name="Id" Type="integer" Nullable="false" />
</EntityType>
<EntityType Name="Status">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="ServerVersion" Type="varchar" MaxLength="127" Nullable="false" />
<Property Name="Host" Type="varchar" MaxLength="127" Nullable="false" />
<Property Name="Port" Type="integer" Nullable="false" />
<Property Name="DatabaseName" Type="varchar" MaxLength="127" Nullable="false" />
<Property Name="SessionId" Type="integer" Nullable="false" />
<Property Name="StatisticsEnabled" Type="smallint_as_boolean" Nullable="false" />
<Property Name="Id" Type="integer" Nullable="false" />
</EntityType>
</Schema>
The following code fragment is an example of the MSL model:
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping
StorageEntityContainer="SampleStoreContainer"
CdmEntityContainer="SampleContainer">
<EntitySetMapping Name="PsqlConnectionStatistics">
<EntityTypeMapping TypeName="EntityModel.PsqlConnectionStatistics">
<MappingFragment StoreEntitySet="Connection_Statistics">
<ScalarProperty Name="SocketReadTime" ColumnName="SocketReadTime" />
<ScalarProperty Name="MaxSocketReadTime" ColumnName="MaxSocketReadTime" />
<ScalarProperty Name="SocketReads" ColumnName="SocketReads" />
<ScalarProperty Name="BytesReceived" ColumnName="BytesReceived" />
<ScalarProperty Name="MaxBytesPerSocketRead" ColumnName="MaxBytesPerSocketRead" />
<ScalarProperty Name="SocketWriteTime" ColumnName="SocketWriteTime" />
<ScalarProperty Name="MaxSocketWriteTime" ColumnName="MaxSocketWriteTime" />
<ScalarProperty Name="SocketWrites" ColumnName="SocketWrites" />
<ScalarProperty Name="BytesSent" ColumnName="BytesSent" />
<ScalarProperty Name="MaxBytesPerSocketWrite" ColumnName="MaxBytesPerSocketWrite" />
<ScalarProperty Name="TimeToDisposeOfUnreadRows" ColumnName="TimeToDisposeOfUnreadRows" />
<ScalarProperty Name="SocketReadsToDisposeUnreadRows" ColumnName="SocketReadsToDisposeUnreadRows" />
<ScalarProperty Name="BytesRecvToDisposeUnreadRows" ColumnName="BytesRecvToDisposeUnreadRows" />
<ScalarProperty Name="IDUCount" ColumnName="IDUCount" />
<ScalarProperty Name="SelectCount" ColumnName="SelectCount" />
<ScalarProperty Name="StoredProcedureCount" ColumnName="StoredProcedureCount" />
<ScalarProperty Name="DDLCount" ColumnName="DDLCount" />
<ScalarProperty Name="PacketsReceived" ColumnName="PacketsReceived" />
<ScalarProperty Name="PacketsSent" ColumnName="PacketsSent" />
<ScalarProperty Name="ServerRoundTrips" ColumnName="ServerRoundTrips" />
<ScalarProperty Name="SelectRowsRead" ColumnName="SelectRowsRead" />
<ScalarProperty Name="StatementCacheHits" ColumnName="StatementCacheHits" />
<ScalarProperty Name="StatementCacheMisses" ColumnName="StatementCacheMisses" />
<ScalarProperty Name="StatementCacheReplaces" ColumnName="StatementCacheReplaces" />
<ScalarProperty Name="StatementCacheTopHit1" ColumnName="StatementCacheTopHit1" />
<ScalarProperty Name="StatementCacheTopHit2" ColumnName="StatementCacheTopHit2" />
<ScalarProperty Name="StatementCacheTopHit3" ColumnName="StatementCacheTopHit3" />
<ScalarProperty Name="PacketsReceivedPerSocketRead" ColumnName="PacketsReceivedPerSocketRead" />
<ScalarProperty Name="BytesReceivedPerSocketRead" ColumnName="BytesReceivedPerSocketRead" />
<ScalarProperty Name="PacketsSentPerSocketWrite" ColumnName="PacketsSentPerSocketWrite" />
<ScalarProperty Name="BytesSentPerSocketWrite" ColumnName="BytesSentPerSocketWrite" />
<ScalarProperty Name="PacketsSentPerRoundTrip" ColumnName="PacketsSentPerRoundTrip" />
<ScalarProperty Name="PacketsReceivedPerRoundTrip" ColumnName="PacketsReceivedPerRoundTrip" />
<ScalarProperty Name="BytesSentPerRoundTrip" ColumnName="BytesSentPerRoundTrip" />
<ScalarProperty Name="BytesReceivedPerRoundTrip" ColumnName="BytesReceivedPerRoundTrip" />
<ScalarProperty Name="Id" ColumnName="Id" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="PsqlStatus">
<EntityTypeMapping TypeName="EntityModel.PsqlStatus">
<MappingFragment StoreEntitySet="Status">
<ScalarProperty Name="ServerVersion" ColumnName="ServerVersion" />
<ScalarProperty Name="Host" ColumnName="Host" />
<ScalarProperty Name="Port" ColumnName="Port" />
<ScalarProperty Name="DatabaseName" ColumnName="DatabaseName" />
<ScalarProperty Name="SessionId" ColumnName="SessionId" />
<ScalarProperty Name="StatisticsEnabled" ColumnName="StatisticsEnabled" />
<ScalarProperty Name="Id" ColumnName="Id" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<FunctionImportMapping FunctionImportName="RetrieveStatistics" FunctionName="EntityModel.Store.RetrieveStatistics" />
<FunctionImportMapping FunctionImportName="EnableStatistics" FunctionName="EntityModel.Store.EnableStatistics" />
<FunctionImportMapping FunctionImportName="DisableStatistics" FunctionName="EntityModel.Store.DisableStatistics" />
<FunctionImportMapping FunctionImportName="ResetStatistics" FunctionName="EntityModel.Store.ResetStatistics" />
<FunctionImportMapping FunctionImportName="Reauthenticate" FunctionName="EntityModel.Store.Reauthenticate" />
</EntityContainerMapping>
</Mapping>
Breaking the model down further, a CSDL model is established at the conceptual layer – this is what is exposed to the EDM.
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="EntityModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="SampleContainer">
<EntitySet Name="PsqlConnectionStatistics" EntityType="EntityModel.PsqlConnectionStatistics" />
<EntitySet Name="PsqlStatus" EntityType="EntityModel.PsqlStatus" />
<FunctionImport Name="RetrieveStatistics" EntitySet="PsqlConnectionStatistics" ReturnType="Collection(EntityModel.PsqlConnectionStatistics)" />
<FunctionImport Name="EnableStatistics" EntitySet="PsqlStatus" ReturnType="Collection(EntityModel.PsqlStatus)" />
<FunctionImport Name="DisableStatistics" EntitySet="PsqlStatus" ReturnType="Collection(EntityModel.PsqlStatus)" />
<FunctionImport Name="ResetStatistics" EntitySet="PsqlStatus" ReturnType="Collection(EntityModel.PsqlStatus)" />
<FunctionImport Name="Reauthenticate" EntitySet="PsqlStatus" ReturnType="Collection(EntityModel.PsqlStatus)">
<Parameter Name="CurrentUser" Type="String" />
<Parameter Name="CurrentPassword" Type="String" />
<Parameter Name="CurrentUserAffinityTimeout" Type="Int32" />
</FunctionImport>
</EntityContainer>
<EntityType Name="PsqlConnectionStatistics">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="SocketReadTime" Type="Double" Nullable="false" />
<Property Name="MaxSocketReadTime" Type="Double" Nullable="false" />
<Property Name="SocketReads" Type="Int64" Nullable="false" />
<Property Name="BytesReceived" Type="Int64" Nullable="false" />
<Property Name="MaxBytesPerSocketRead" Type="Int64" Nullable="false" />
<Property Name="SocketWriteTime" Type="Double" Nullable="false" />
<Property Name="MaxSocketWriteTime" Type="Double" Nullable="false" />
<Property Name="SocketWrites" Type="Int64" Nullable="false" />
<Property Name="BytesSent" Type="Int64" Nullable="false" />
<Property Name="MaxBytesPerSocketWrite" Type="Int64" Nullable="false" />
<Property Name="TimeToDisposeOfUnreadRows" Type="Double" Nullable="false" />
<Property Name="SocketReadsToDisposeUnreadRows" Type="Int64" Nullable="false" />
<Property Name="BytesRecvToDisposeUnreadRows" Type="Int64" Nullable="false" />
<Property Name="IDUCount" Type="Int64" Nullable="false" />
<Property Name="SelectCount" Type="Int64" Nullable="false" />
<Property Name="StoredProcedureCount" Type="Int64" Nullable="false" />
<Property Name="DDLCount" Type="Int64" Nullable="false" />
<Property Name="PacketsReceived" Type="Int64" Nullable="false" />
<Property Name="PacketsSent" Type="Int64" Nullable="false" />
<Property Name="ServerRoundTrips" Type="Int64" Nullable="false" />
<Property Name="SelectRowsRead" Type="Int64" Nullable="false" />
<Property Name="StatementCacheHits" Type="Int64" Nullable="false" />
<Property Name="StatementCacheMisses" Type="Int64" Nullable="false" />
<Property Name="StatementCacheReplaces" Type="Int64" Nullable="false" />
<Property Name="StatementCacheTopHit1" Type="Int64" Nullable="false" />
<Property Name="StatementCacheTopHit2" Type="Int64" Nullable="false" />
<Property Name="StatementCacheTopHit3" Type="Int64" Nullable="false" />
<Property Name="PacketsReceivedPerSocketRead" Type="Double" Nullable="false" />
<Property Name="BytesReceivedPerSocketRead" Type="Double" Nullable="false" />
<Property Name="PacketsSentPerSocketWrite" Type="Double" Nullable="false" />
<Property Name="BytesSentPerSocketWrite" Type="Double" Nullable="false" />
<Property Name="PacketsSentPerRoundTrip" Type="Double" Nullable="false" />
<Property Name="PacketsReceivedPerRoundTrip" Type="Double" Nullable="false" />
<Property Name="BytesSentPerRoundTrip" Type="Double" Nullable="false" />
<Property Name="BytesReceivedPerRoundTrip" Type="Double" Nullable="false" />
<Property Name="Id" Type="Int32" Nullable="false" />
</EntityType>
<EntityType Name="PsqlStatus">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="ServerVersion" Type="String" Nullable="false" />
<Property Name="Host" Type="String" Nullable="false" />
<Property Name="Port" Type="Int32" Nullable="false" />
<Property Name="DatabaseName" Type="String" Nullable="false" />
<Property Name="SessionId" Type="Int32" Nullable="false" />
<Property Name="StatisticsEnabled" Type="Boolean" Nullable="false" />
<Property Name="Id" Type="Int32" Nullable="false" />
</EntityType>
</Schema>