Aracılığıyla paylaş


İzlenecek yol: türü sağlayıcıları ve varlıkların (F#) kullanarak bir sql veritabanına erişme

Bu F# 3.0 için izlenecek yol size ADO.NET Varlık Veri Modeli'ni temel alan bir SQL veritabanı için türlü veriye nasıl erişeceğinizi gösterir. Bu izlenecek yol size nasıl bir SQL veritabanı ile kullanmak için F# SqlEntityConnection tür sağlayıcısını ayarlayacağınızı, veri için nasıl sorgular yazacağınızı, veritabanına saklı yordamları nasıl çağıracağınızı, ve ayrıca veritabanını güncellemek için bazı ADO.NET Varlık Çerçevesi türlerini ve yöntemlerini nasıl kullanacağınızı gösterir.

Bu izlenecek yol, başarılı olması için bu sırayla gerçekleştirmeniz gereken aşağıdaki görevleri gösterir:

  • School veritabanını oluşturma .

  • Bir F# projesi oluşturma ve yapılandırma .

  • Tür sağlayıcısını yapılandırma, ve Varlık Veri Modeli'ne bağlanma .

  • Veritabanını sorgulama .

  • Veritabanını güncelleme

Önkoşullar

Bu adımları tamamlamak için üzerinde bir veritabanı oluşturabileceğiniz SQL Server çalıştıran bir sunucuya erişiminiz olmalıdır.

School veritabanını oluşturma

School veritabanını SQL Server çalıştıran ve yönetimsel erişiminiz olan herhangi bir sunucu üzerinde olutşurabilir, ya da LocalDB kullanabilirsiniz.

School veritabanını oluşturmak için

  1. Server Explorer içinde, Data Connections düğümü için kısayol menüsünü açın, ve ardından Add Connection seçin.

    Add Connection iletişim kutusu görüntülenir.

  2. Server name kutusu içinde, yönetimsel erişiminiz olan bir SQL Server örneğinin adını belirtin, ya da eğer bir sunucuya erişiminiz yoksa (localdb\v11.0) belirtin.

    SQL Server Express LocalDB makineniz üzerinde geliştirme ve sınama için bir hafif veritabanı sunucusu sağlar. LocalDB hakkında daha fazla bilgi için, bkz: İzlenecek yol: Yerel Veritabanı Oluşturma.

    Server Explorer içinde Data Connections altında yeni bir düğüm oluşturulur.

  3. Yeni bağlantı düğümü için kısayol menüsünü açın, ve ardından New Query seçin.

  4. Microsoft web sitesi üzerinde School Örnek Veritabanını Oluşturma açın, ve ardından düzenleyici penceresi içine Student veritabanını oluşturan veritabanı betiğini kopyalayın ve yapıştırın.

    Bu izlenecek yoldaki sonraki adımlar bu eğitici makaleyi temel alır: ADO.NET Entity Data Model Quickstart.

Bir F# projesi oluşturma ve yapılandırma

Bu adımda, bir proje oluşturursunuz ve onu bir tür sağlayıcısı kullanması için ayarlarsınız.

Bir F# projesi oluşturmak ve yapılandırmak için:

  1. Önceki projeyi kapatın, başka bir proje oluşturun, ve onu SchoolEDM olarak adlandırın.

  2. Solution Explorer içinde, References için kısayol menüsünü açın, ve ardından Add Reference seçin.

  3. Framework düğümünü seçin, ve ardından, Framework listesi içinde, System.Data, System.Data.Entity, ve System.Data.Linq seçin.

  4. Extensions düğümünü seçin, FSharp.Data.TypeProviders derlemesine bir başvuru ekleyin, ve ardından iletişim kutusunu kapatmak için OK düğmesini seçin.

  5. Bir iç modül tanımlamak ve uygun ad alanlarını açmak için aşağıdaki kodu ekleyin: Tür sağlayıcısı türleri yalnızca bir özel ya da iç ad alanına ekleyebilir.

    module internal SchoolEDM
    
    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    
  6. Bu izlenecek yoldaki kodu derlenmiş bir program yerine etkileşimli şekilde bir betik olarak çalıştırmak için, proje düğümü için kısayol menüsünü açın, Add New Item seçin, bir F# betik dosyası ekleyin, ve ardından betiğe her adımdaki kodu ekleyin. Derleme başvurularını yüklemek için, aşağıdaki satırları ekleyin.

    #r "System.Data.Entity.dll"
    #r "FSharp.Data.TypeProviders.dll"
    #r "System.Data.Linq.dll"
    
  7. Her kod bloğunu ekledikçe vurgulayın, ve Alt + Enter tuşlarını seçerek F# Interactive içinde çalıştırın.

Tür sağlayıcısını yapılandırma, ve Varlık Veri Modeli'ne bağlanma

Bu adımda, bir veri bağlantısı ile bir tür sağlayıcısı ayarlarsınız ve veriyle çalışmanıza olanak veren bir veri bağlamı elde edersiniz.

Tür sağlayıcısını yapılandırmak, ve Varlık Veri Modeli'ne bağlanmak için:

  1. Daha önce oluşturduğunuz Varlık Veri Modeli'ni temel alan F# türleri üreten SqlEntityConnection tür sağlayıcısını yapılandırmak için aşağıdaki kodu girin. Tam EDMX bağlantı dizesi yerine, yalnızca SQL bağlantı dizesini kullanın.

    type private EntityConnection = SqlEntityConnection<ConnectionString="Server=SERVER\InstanceName;Initial Catalog=School;Integrated Security=SSPI;MultipleActiveResultSets=true",
                                                        Pluralize = true>
     >
    

    Bu eylem daha önce oluşturduğunuz veritabanı bağlantısı ile bir tür sağlayıcısı ayarlar. MultipleActiveResultSets özelliği ADO.NET Varlık Çerçevesi kullandığınızda gereklidir, çünkü bu özellik tek bağlantıda veritabanı üzerinde birden çok komutun zaman uyumsuz olarak yürütülmesine olanak verir, ki bu ADO.NET Varlık Çerçevesi kodu içinde sık sık gerçekleşebilir. Daha fazla bilgi için, bkz: Birden Çok Etkin Sonuç Kümeleri (MARS).

  2. Veritabanı tablolalarını özellikler olarak ve veritabanı saklı yordamlarını ve işlevlerini yöntemler olarak içeren bir nesne olan veri bağlamını alın.

    let context = EntityConnection.GetDataContext()
    

Veritabanını sorgulama

Bu adımda, veritabanı üzerinde çeşitli sorguları yürütmek için F# sorgu ifadelerini kullanırsınız.

Verileri sorgulamak için

  • Varlık veri modelinden veriyi sorgulamak için aşağıdaki kodu girin. Veri tabanı tablosu Course'u Courses olarak ve Person'ı People olarak çeviren Pluralize = true etkisine dikkat edin.

    query { for course in context.Courses do
            select course }
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    query { for person in context.People do
            select person }
    |> Seq.iter (fun person -> printfn "%s %s" person.FirstName person.LastName)
    
    // Add a where clause to filter results.
    query { for course in context.Courses do
            where (course.DepartmentID = 1)
            select course }
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    // Join two tables.
    query { for course in context.Courses do
            join dept in context.Departments on (course.DepartmentID = dept.DepartmentID)
            select (course, dept.Name) }
    |> Seq.iter (fun (course, deptName) -> printfn "%s %s" course.Title deptName)
    

Veritabanını güncelleme

Veritabanını güncellemek için, Varlık Çerçevesi sınıflarını ve yöntemlerini kullanırsınız. SQLEntityConnection tür sağlayıcısı ile iki tür veri bağlamı kullanabilirsiniz. İlki, ServiceTypes.SimpleDataContextTypes.EntityContainer basitleştirilmiş veri bağlamıdır, ve yalnızca veritabanı tablolarını ve sütunlarını temsil eden sağlanan özellikleri içerir. İkincisi, tam veri bağlamı bir Varlık Çerçevesi sınıfı ObjectContext örneğidir, ve veritabanına satırlar eklemek için AddObject yöntemini içerir. Varlık Çerçevesi tabloları ve aralarındaki ilişkiyi tanır, ve böylece veritabanı tutarlılığını sağlar.

Veritabanını güncellemek için

  1. Aşağıdaki kodu programınıza ekleyin. Bu örnekte, aralarında bir ilişki olan iki nesne eklersiniz, ve bir eğitmen ve bir ofis ataması eklersiniz. OfficeAssignments tablosu InstructorID sütununu içerir, ki bu Person tablosu içindeki PersonID sütununa başvurur.

    // The full data context
    let fullContext = context.DataContext
    
    // A helper function.
    let nullable value = new System.Nullable<_>(value)
    
    let addInstructor(lastName, firstName, hireDate, office) =
        let hireDate = DateTime.Parse(hireDate)
        let newPerson = new EntityConnection.ServiceTypes.Person(LastName = lastName,
                                                    FirstName = firstName,
                                                    HireDate = nullable hireDate)
        fullContext.AddObject("People", newPerson)
        let newOffice = new EntityConnection.ServiceTypes.OfficeAssignment(Location = office)
        fullContext.AddObject("OfficeAssignments", newOffice)
        fullContext.CommandTimeout <- nullable 1000
        fullContext.SaveChanges() |> printfn "Saved changes: %d object(s) modified."
    
    addInstructor("Parker", "Darren", "1/1/1998", "41/3720")
    

    Siz SaveChanges çağırana kadar veritabanı içinde hiçbir şey değişmez.

  2. Şimdi eklediğiniz nesneleri silerek veritabanını önceki durumuna geri yükleyin.

    let deleteInstructor(lastName, firstName) =
            query {
                for person in context.People do
                where (person.FirstName = firstName &&
                        person.LastName = lastName)
                select person
            }
            |> Seq.iter (fun person->
                query {
                    for officeAssignment in context.OfficeAssignments do
                    where (officeAssignment.Person.PersonID = person.PersonID)
                    select officeAssignment }
                |> Seq.iter (fun officeAssignment -> fullContext.DeleteObject(officeAssignment))
    
                fullContext.DeleteObject(person))
    
            // The call to SaveChanges should be outside of any iteration on the queries.
            fullContext.SaveChanges() |> printfn "Saved changed: %d object(s) modified."
    
    deleteInstructor("Parker", "Darren")
    

    Uyarı

    Bir sorgu ifadesi kullandığınızda, sorgunun tembel değerlendirmeye bağlı olduğunu hatırlamalısınız.Bu nedenle, veritabanı herhangi bir zincirleme değerlendirme sırasında hala okumaya açıktır, her sorgu ifadesi sonrasındaki lambda ifadesi blokları gibi.Açıkça ya da örtülü olarak bir işlem kullanan herhangi bir veritabanı işlemi okuma işlemleri tamamlandıktan sonra gerçekleşmelidir.

Sonraki Adımlar

Sorgu ifadelerini (F#) içinde kullanılabilir olan sorgu işleçlerini gözden geçirerek diğer sorgu seçeneklerini araştırın, ve ayrıca bu tür sağlayıcısını kullandığınızda nasıl bir işlevselliğin mevcut olduğunu anlamak için ADO.NET Entity Framework gözden geçirin.

Ayrıca bkz.

Görevler

İzlenecek yol: F# türleriyle edmx şema dosyasından (F#) oluşturma

Başvuru

SqlEntityConnection türü sağlayıcı (F#)

Diğer Kaynaklar

Sağlayıcı türü

ADO.NET Entity Framework

.edmx File Overview (Entity Framework)

Edm Generator (EdmGen.exe)