Procedura: definire un modello con una singola entità mappata a due tabelle
In questo argomento viene descritto come creare manualmente un modello concettuale nel quale un tipo di entità viene mappato a due tabelle nel database sottostante. È possibile utilizzare questi stessi concetti per eseguire il mapping di un tipo di entità a più di due tabelle.
Nota: |
---|
Per definire un modello con un tipo di entità mappata a più tabelle è consigliabile utilizzare gli ADO.NET Entity Data Model Tools.Per ulteriori informazioni, vedere Walkthrough: Mapping an Entity to Multiple Tables. |
È consigliabile eseguire il mapping di un tipo di entità a più tabelle solo se si verificano le condizioni seguenti:
Le tabelle verso le quali si esegue il mapping condividono una chiave comune.
Il tipo di entità di cui si esegue il mapping presenta voci in ogni tabella sottostante. In altre parole, il tipo di entità rappresenta dati con una corrispondenza uno-a-uno tra le due tabelle, ovvero rappresenta un inner join delle due tabelle.
I passaggi di base per la definizione manuale di un modello con un'entità mappata a due tabelle sono i seguenti:
Definire un tipo di entità con proprietà che corrispondono alle colonne in ognuna delle tabelle sottostanti. Per ulteriori informazioni, vedere Elemento EntityType (CSDL).
Definire il mapping per il tipo di entità utilizzando un elemento MappingFragment per ogni tabella sottostante. Per ulteriori informazioni, vedere Elemento EntityTypeMapping (MSL) e Elemento MappingFragment (MSL).
Nell'esempio seguente si suppone che sia stato installato il database di esempio School e che il progetto sia stato configurato manualmente per l'utilizzo di Entity Framework . Per ulteriori informazioni, vedere Creazione del database di esempio School (Guida rapida di Entity Framework) e Configurazione di Entity Framework (attività di Entity Framework).
Nota: |
---|
Nell'esempio seguente viene eseguito il mapping di un tipo di entità alle tabelle Person e OfficeAssignement nel database di esempio School.Le condizioni per l'esecuzione del mapping di un tipo di entità a queste tabelle sono soddisfatte.In particolare, un inner join delle due tabelle restituirà tutte le persone per le quali è disponibile l'assegnazione di un ufficio. |
Per creare il modello di archiviazione
Aggiungere il file XML seguente al progetto e denominarlo
School.ssdl
.<Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl"> <EntityContainer Name="SchoolModelStoreContainer"> <EntitySet Name="OfficeAssignment" EntityType="SchoolModel.Store.OfficeAssignment" store:Type="Tables" Schema="dbo" /> <EntitySet Name="Person" EntityType="SchoolModel.Store.Person" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="OfficeAssignment"> <Key> <PropertyRef Name="InstructorID" /> </Key> <Property Name="InstructorID" Type="int" Nullable="false" /> <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Timestamp" Type="timestamp" Nullable="false" StoreGeneratedPattern="Computed" /> </EntityType> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Name="PersonID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="HireDate" Type="datetime" /> <Property Name="EnrollmentDate" Type="datetime" /> </EntityType> </Schema>
Per creare il modello concettuale
Aggiungere il file XML seguente al progetto e denominarlo
School.csdl
. Tenere presente quanto segue:Il tipo di entità Instructor include proprietà che eseguono il mapping a tutte le colonne nelle tabelle Person e OfficeAssignment. Per i dettagli sulle tabelle, vedere il modello di archiviazione precedente.
Nota: Poiché il tipo di entità Instructor è un tipo ereditato, eredita tutte le proprietà dal relativo tipo di base Person.Insieme alle proprietà univoche del tipo Instructor, il tipo di entità Instructor presenta proprietà che vengono mappate a tutte le colonne delle tabelle sottostanti.
<Schema Namespace="SchoolModel" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="https://schemas.microsoft.com/ado/2008/09/edm"> <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true"> <EntitySet Name="People" EntityType="SchoolModel.Person" /> </EntityContainer> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Type="Int32" Name="PersonID" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> <Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="DateTime" Name="EnrollmentDate" /> </EntityType> <EntityType Name="Instructor" BaseType="SchoolModel.Person" > <Property Type="DateTime" Name="HireDate" Nullable="false" /> <Property Type="Binary" Name="Timestamp" Nullable="false" MaxLength="8" FixedLength="true" annotation:StoreGeneratedPattern="Computed" /> <Property Type="String" Name="Location" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> </EntityType> </Schema>
Per definire il mapping tra il modello concettuale e il modello di archiviazione
Aggiungere il file XML seguente al progetto e denominarlo
School.msl
. Tenere presente quanto segue:- All'interno dell'elemento EntityTypeMapping per il tipo di entità Instructor, vengono utilizzati elementi MappingFragment separati per eseguire il mapping delle proprietà alle tabelle appropriate.
<Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="People"> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="HireDate" ColumnName="HireDate" /> <Condition ColumnName="HireDate" IsNull="false" /> </MappingFragment> <MappingFragment StoreEntitySet="OfficeAssignment"> <ScalarProperty Name="PersonID" ColumnName="InstructorID" /> <ScalarProperty Name="Timestamp" ColumnName="Timestamp" /> <ScalarProperty Name="Location" ColumnName="Location" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="LastName" ColumnName="LastName" /> <ScalarProperty Name="FirstName" ColumnName="FirstName" /> <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
Vedere anche
Altre risorse
Specifiche CSDL, SSDL e MSL
Definizione di modelli di dati avanzati (attività di Entity Framework)