Sorgu Tanımlama - EF Tasarım Aracı

Bu kılavuzda, EF Tasarım Aracı kullanarak modele bir tanımlama sorgusu ve karşılık gelen varlık türünün nasıl ekleneceği gösterilmektedir. Tanımlama sorgusu genellikle veritabanı görünümü tarafından sağlanana benzer işlevler sağlamak için kullanılır, ancak görünüm veritabanında değil modelde tanımlanır. Tanımlama sorgusu, bir .edmx dosyasının DefiningQuery öğesinde belirtilen bir SQL deyimi yürütmenizi sağlar. Daha fazla bilgi için bkz. SSDL Belirtiminde DefiningQuery.

Sorguları tanımlarken, modelinizde bir varlık türü de tanımlamanız gerekir. Varlık türü, tanımlama sorgusu tarafından kullanıma sunulan verileri ortaya çıkarabilmek için kullanılır. Bu varlık türü aracılığıyla ortaya çıkarılmış verilerin salt okunur olduğunu unutmayın.

Parametreli sorgular, sorguları tanımlarken yürütülemez. Ancak veriler, verileri saklı yordamlarla ortaya çıkaran varlık türünün ekleme, güncelleştirme ve silme işlevleri eşlenerek güncelleştirilebilir. Daha fazla bilgi için bkz . Saklı Yordamlarla Ekleme, Güncelleştirme ve Silme.

Bu konu başlığında aşağıdaki görevlerin nasıl gerçekleştirebileceğiniz gösterilmektedir.

  • Tanımlama Sorgusu Ekleme
  • Modele Varlık Türü Ekleme
  • Tanımlama Sorgusunu Varlık Türüne Eşleme

Ön koşullar

Bu kılavuzu tamamlamak için şunlara ihtiyacınız olacak:

Projeyi ayarlama

Bu izlenecek yol Visual Studio 2012 veya daha yeni bir sürümünü kullanıyor.

  • Visual Studio'yu açın.
  • Dosya menüsünde Yeni'nin üzerine gelin ve Proje'ye tıklayın.
  • Sol bölmede Visual C# öğesine tıklayın ve konsol uygulaması şablonunu seçin.
  • Projenin adı olarak DefiningQuerySample girin ve Tamam'a tıklayın.

 

School Database'i temel alan bir Model oluşturma

  • Çözüm Gezgini'da proje adına sağ tıklayın, Ekle'nin üzerine gelin ve Yeni Öğe'ye tıklayın.

  • Soldaki menüden Veri'yi seçin ve ardından Şablonlar bölmesinde Varlık Veri Modeli'ni ADO.NET seçin.

  • Dosya adı olarak DefiningQueryModel.edmx yazın ve Ekle'ye tıklayın.

  • Model İçeriği Seç iletişim kutusunda Veritabanından oluştur'u seçin ve ardından İleri'ye tıklayın.

  • Yeni Bağlan ion'a tıklayın. Bağlan ion Özellikleri iletişim kutusunda sunucu adını girin (örneğin, (localdb)\mssqllocaldb), kimlik doğrulama yöntemini seçin, veritabanı adı için School yazın ve Tamam'a tıklayın. Verilerinizi seçin Bağlan ion iletişim kutusu veritabanı bağlantı ayarınızla güncelleştirilir.

  • Veritabanı Nesnelerinizi Seçin iletişim kutusunda Tablolar düğümünü işaretleyin. Bu, tüm tabloları School modeline ekler.

  • Finish (Son) düğmesine tıklayın.

  • Çözüm Gezgini'da, DefiningQueryModel.edmx dosyasına sağ tıklayın ve Birlikte Aç... öğesini seçin.

  • XML (Metin) Düzenleyicisi'ni seçin.

    XML Editor

  • Aşağıdaki ileti istenirse Evet'e tıklayın:

    Warning 2

 

Tanımlama Sorgusu Ekleme

Bu adımda XML Düzenleyicisi'ni kullanarak .edmx dosyasının SSDL bölümüne bir tanımlama sorgusu ve varlık türü ekleyeceğiz. 

  • .edmx dosyasının SSDL bölümüne bir EntitySet öğesi ekleyin (satır 5 ile 13). Aşağıdakileri belirtin:
    • Yalnızca EntitySet öğesinin Name ve EntityType öznitelikleri belirtilir.
    • Varlık türünün tam adı EntityType özniteliğinde kullanılır.
    • Yürütülecek SQL deyimi, DefiningQuery öğesinde belirtilir.
    <!-- 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" />
  • EntityType öğesini .edmx'in SSDL bölümüne ekleyin. dosyasını seçin. Aşağıdakilere dikkat edin:
    • Name özniteliğinin değeri, yukarıdaki EntitySet öğesindeki EntityType özniteliğinin değerine karşılık gelir, ancak varlık türünün tam adı EntityType özniteliğinde kullanılır.
    • Özellik adları, DefiningQuery öğesinde (yukarıda) SQL deyimi tarafından döndürülen sütun adlarına karşılık gelir.
    • Bu örnekte, varlık anahtarı benzersiz bir anahtar değeri sağlamak için üç özelliklerden oluşur.
    <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>

Dekont

Daha sonra Modeli Güncelleştirme Sihirbazı iletişim kutusunu çalıştırırsanız, sorgu tanımlama da dahil olmak üzere depolama modelinde yapılan tüm değişikliklerin üzerine yazılır.

 

Modele Varlık Türü Ekleme

Bu adımda EF Tasarım Aracı kullanarak varlık türünü kavramsal modele ekleyeceğiz.  Aşağıdakileri dikkate alın:

  • Varlığın Adı, yukarıdaki EntitySet öğesindeki EntityType özniteliğinin değerine karşılık gelir.
  • Özellik adları, yukarıdaki DefiningQuery öğesindeki SQL deyimi tarafından döndürülen sütun adlarına karşılık gelir.
  • Bu örnekte, varlık anahtarı benzersiz bir anahtar değeri sağlamak için üç özelliklerden oluşur.

Modeli EF Tasarım Aracı açın.

  • DefiningQueryModel.edmx öğesine çift tıklayın.

  • Aşağıdaki iletiye Evet deyin:

    Warning 2

 

Modelinizi düzenlemek için bir tasarım yüzeyi sağlayan Entity Tasarım Aracı görüntülenir.

  • Tasarımcı yüzeyine sağ tıklayın ve Yeni Varlık> Ekle... öğesini seçin.
  • Varlık adı için GradeReport değerini ve Anahtar Özelliği için CourseID değerini belirtin.
  • GradeReport varlığına sağ tıklayın ve Yeni-Skaler> Özellik Ekle'yi seçin.
  • Özelliğin varsayılan adını FirstName olarak değiştirin.
  • Başka bir skaler özellik ekleyin ve ad için Soyadı'nı belirtin.
  • Başka bir skaler özellik ekleyin ve ad için Grade değerini belirtin.
  • Özellikler penceresinde, Not'un Tür özelliğini Ondalık olarak değiştirin.
  • Ad ve Soyadı özelliklerini seçin.
  • Özellikler penceresinde EntityKey özellik değerini True olarak değiştirin.

Sonuç olarak, .edmx dosyasının CSDL bölümüne aşağıdaki öğeler eklendi.

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

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

 

Tanımlama Sorgusunu Varlık Türüne Eşleme

Bu adımda, kavramsal ve depolama varlık türlerini eşlemek için Eşleme Ayrıntıları penceresini kullanacağız.

  • Tasarım yüzeyinde GradeReport varlığına sağ tıklayın ve Tablo Eşleme'yi seçin.
    Eşleme Ayrıntıları penceresi görüntülenir.
  • Tablo Ekle veya Görünüm> açılan listesinden <GradeReport'u seçin (Tablo'nunaltında bulunur).
    Kavramsal ve depolama GradeReport varlık türü arasındaki varsayılan eşlemeler görüntülenir.
    Mapping Details3

Sonuç olarak, EntitySetMapping öğesi .edmx dosyasının eşleme bölümüne eklenir. 

    <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>
  • Uygulamayı derleyin.

 

Kodunuzda Tanımlama Sorgusunu Çağırma

Artık GradeReport varlık türünü kullanarak tanımlama sorgusunu yürütebilirsiniz. 

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