Definování dotazu – NÁVRHÁŘ EF

Tento názorný postup ukazuje, jak přidat definující dotaz a odpovídající typ entity do modelu pomocí ef Designeru. Definující dotaz se běžně používá k poskytování funkcí podobných funkcím, které poskytuje zobrazení databáze, ale zobrazení je definováno v modelu, nikoli v databázi. Definující dotaz umožňuje spustit příkaz SQL, který je zadaný v elementu DefiningQuery souboru .edmx. Další informace naleznete v tématu DefiniceQuery ve specifikaci SSDL.

Při definování dotazů musíte také definovat typ entity v modelu. Typ entity slouží k zobrazení dat vystavených definováním dotazu. Všimněte si, že data, která se zobrazí prostřednictvím tohoto typu entity, jsou jen pro čtení.

Parametrizované dotazy nelze spustit jako definování dotazů. Data je však možné aktualizovat namapováním funkcí vložení, aktualizace a odstranění typu entity, které data zobrazí uloženým procedurům. Další informace naleznete v tématu Vložení, aktualizace a odstranění pomocí uložených procedur.

Toto téma ukazuje, jak provádět následující úlohy.

  • Přidání definující dotazu
  • Přidání typu entity do modelu
  • Mapování dotazu na typ entity

Požadavky

K dokončení toho návodu budete potřebovat:

Nastavení projektu

Tento názorný postup používá Visual Studio 2012 nebo novější.

  • Otevřete sadu Visual Studio.
  • V nabídce Soubor přejděte na příkaz Nový a klepněte na tlačítko Projekt.
  • V levém podokně klikněte na Visual C# a pak vyberte šablonu konzolové aplikace .
  • Jako název projektu zadejte DefiningQuerySample a klikněte na OK.

 

Vytvoření modelu založeného na školní databázi

  • Klikněte pravým tlačítkem myši na název projektu v Průzkumník řešení, přejděte na příkaz Přidat a potom klikněte na položku Nová položka.

  • V nabídce vlevo vyberte Data a pak v podokně Šablony vyberte ADO.NET Model dat entity.

  • Jako název souboru zadejte DefiningQueryModel.edmx a klepněte na tlačítko Přidat.

  • V dialogovém okně Zvolit obsah modelu vyberte Vygenerovat z databáze a potom klepněte na tlačítko Další.

  • Klikněte na Tlačítko Nový Připojení ion. V dialogovém okně vlastnosti Připojení ion zadejte název serveru (například (localdb)\mssqllocaldb), vyberte metodu ověřování, jako název databáze zadejte School a klikněte na tlačítko OK. Dialogové okno Zvolit data Připojení ion se aktualizuje nastavením připojení k databázi.

  • V dialogovém okně Zvolit databázové objekty zaškrtněte uzel Tabulky . Tím se všechny tabulky přidají do školního modelu.

  • Klikněte na Finish (Dokončit).

  • V Průzkumník řešení klikněte pravým tlačítkem na soubor DefiningQueryModel.edmx a vyberte Otevřít v aplikaci....

  • Vyberte editor XML (text).

    XML Editor

  • Pokud se zobrazí výzva s následující zprávou, klikněte na tlačítko Ano :

    Warning 2

 

Přidání definující dotazu

V tomto kroku pomocí Editoru XML přidáme definující dotaz a typ entity do oddílu SSDL souboru .edmx. 

  • Přidejte element EntitySet do části SSDL souboru .edmx (řádek 5 až 13). Zadejte následující:
    • Jsou zadány pouze atributy Name a EntityType elementu EntitySet.
    • Plně kvalifikovaný název typu entity se používá v atributu EntityType .
    • Příkaz SQL, který se má spustit, je zadán v elementu 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" />
  • Přidejte element EntityType do oddílu SSDL souboru .edmx. jak je znázorněno níže. Všimněte si následujících věcí:
    • Hodnota atributu Name odpovídá hodnotě EntityType atributu EntityType výše, ačkoli plně kvalifikovaný název typu entity se používá v atributu EntityType.
    • Názvy vlastností odpovídají názvům sloupců vrácených příkazem SQL v elementu DefiningQuery (výše).
    • V tomto příkladu se klíč entity skládá ze tří vlastností, aby se zajistila jedinečná hodnota klíče.
    <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>

Poznámka

Pokud později spustíte dialogové okno Průvodce aktualizací modelu, všechny změny provedené v modelu úložiště, včetně definování dotazů, budou přepsány.

 

Přidání typu entity do modelu

V tomto kroku přidáme typ entity do konceptuálního modelu pomocí ef Designeru.  Je potřeba upozornit na následující:

  • Název entity odpovídá hodnotě EntityType atributu EntitySet výše.
  • Názvy vlastností odpovídají názvům sloupců vrácených příkazem SQL ve výše uvedeném elementu DefiningQuery .
  • V tomto příkladu se klíč entity skládá ze tří vlastností, aby se zajistila jedinečná hodnota klíče.

Otevřete model v nástroji EF Designer.

  • Poklikejte na DefinovatQueryModel.edmx.

  • Řekněte ano následující zprávě:

    Warning 2

 

Zobrazí se Návrhář entit, který poskytuje návrhovou plochu pro úpravy modelu.

  • Klikněte pravým tlačítkem myši na plochu návrháře a vyberte Přidat novou> entitu....
  • Zadejte GradeReport pro název entity a Id kurzu pro klíč vlastnost.
  • Klikněte pravým tlačítkem myši na entitu GradeReport a vyberte Přidat vlastnost New-Scalar>.
  • Změňte výchozí název vlastnosti na FirstName.
  • Přidejte další skalární vlastnost a zadejte příjmení pro název.
  • Přidejte další skalární vlastnost a jako název zadejte Známku .
  • V okně Vlastnosti změňte vlastnost Typ známek na Decimal.
  • Vyberte vlastnosti FirstName a LastName.
  • V okně Vlastnosti změňte hodnotu vlastnosti EntityKey na True.

V důsledku toho byly do oddílu CSDL souboru .edmx přidány následující prvky.

    <EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

    <EntityType Name="GradeReport">
    . . .
    </EntityType>

 

Mapování dotazu na typ entity

V tomto kroku použijeme okno Podrobnosti mapování k mapování konceptuálních typů entit a entit úložiště.

  • Klikněte pravým tlačítkem myši na entitu GradeReport na návrhové ploše a vyberte Mapování tabulky.
    Zobrazí se okno Podrobnosti mapování .
  • Vyberte GradeReport z rozevíracího< seznamu Přidat tabulku nebo Zobrazení> (umístěného v tabulce).
    Zobrazí se výchozí mapování mezi konceptuální entitou a typem entity GradeReport úložiště.
    Mapping Details3

V důsledku toho se element EntitySetMapping přidá do části mapování souboru .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>
  • Zkompilujte aplikaci.

 

Volání definičního dotazu v kódu

Teď můžete spustit definující dotaz pomocí typu entity GradeReport

    using (var context = new SchoolEntities())
    {
        var report = context.GradeReports.FirstOrDefault();
        Console.WriteLine("{0} {1} got {2}",
            report.FirstName, report.LastName, report.Grade);
    }