Aracılığıyla paylaş


Öğretici: MVC 5 kullanarak Entity Framework 6 Code First kullanmaya başlama

Not

Yeni geliştirme için ASP.NET MVC denetleyicileri ve görünümleri üzerinden Core Razor Pages ASP.NET öneririz. Razor Pages kullanan buna benzer bir öğretici serisi için bkz . Öğretici: ASP.NET Core'da Razor Sayfalarını kullanmaya başlama. Yeni öğretici:

  • Takip etmek daha kolaydır.
  • Daha fazla EF Core en iyi deneyimi sağlar.
  • Daha verimli sorgular kullanır.
  • En son API ile daha günceldir.
  • Daha fazla özelliği kapsar.
  • Yeni uygulama geliştirme için tercih edilen yaklaşımdır.

Bu öğretici dizisinde, veri erişimi için Entity Framework 6 kullanan bir ASP.NET MVC 5 uygulaması oluşturmayı öğreneceksiniz. Bu öğreticide Code First iş akışı kullanılır. Code First, Database First ve Model First arasında seçim yapma hakkında bilgi için bkz . Model oluşturma.

Bu öğretici serisinde Contoso University örnek uygulamasının nasıl derlenenleri açıklanmaktadır. Örnek uygulama basit bir üniversite web sitesidir. Bununla öğrenci, kurs ve eğitmen bilgilerini görüntüleyebilir ve güncelleştirebilirsiniz. Oluşturduğunuz iki ekran şunlardır:

Students_Index_page

Öğrenciyi Düzenle

Bu öğreticide şunları yaptınız:

  • MVC web uygulaması oluşturma
  • Site stilini ayarlama
  • Entity Framework 6'yi yükleme
  • Veri modelini oluşturma
  • Veritabanı bağlamı oluşturma
  • Veritabanı'nın test verileriyle başlatılması
  • EF 6'yı LocalDB kullanacak şekilde ayarlama
  • Denetleyici ve görünüm oluşturma
  • Veritabanını görüntüleme

Önkoşullar

MVC web uygulaması oluşturma

  1. Visual Studio'yu açın ve ASP.NET Web Uygulaması (.NET Framework) şablonunu kullanarak bir C# web projesi oluşturun. Projeyi ContosoUniversity olarak adlandırın ve Tamam'ı seçin.

    Visual Studio'da Yeni Proje iletişim kutusu

  2. Yeni ASP.NET Web Uygulaması - ContosoUniversity bölümünde MVC'yi seçin.

    Visual Studio'da yeni web uygulaması iletişim kutusu

    Not

    Varsayılan olarak, Kimlik Doğrulaması seçeneği Kimlik Doğrulaması Yok olarak ayarlanır. Bu öğreticide, web uygulaması kullanıcıların oturum açmasını gerektirmez. Ayrıca, kimlerin oturum açtığına bağlı olarak erişimi kısıtlamaz.

  3. Projeyi oluşturmak için Tamam'ı seçin.

Site stilini ayarlama

Birkaç basit değişiklik site menüsünü, düzenini ve giriş sayfasını ayarlar.

  1. Views\Shared\_Layout.cshtml dosyasını açın ve aşağıdaki değişiklikleri yapın:

    • "ASP.NET Uygulamam" ve "Uygulama adı" örneklerinin her birini "Contoso Üniversitesi" olarak değiştirin.
    • Öğrenciler, Kurslar, Eğitmenler ve Bölümler için menü girdileri ekleyin ve Kişi girdisini silin.

    Değişiklikler aşağıdaki kod parçacığında vurgulanır:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - Contoso University</title>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="navbar-inner">
                <div class="container">
                    <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    @Html.ActionLink("Contoso University", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
                    <div class="nav-collapse collapse">
                        <ul class="nav">
                            <li>@Html.ActionLink("Home", "Index", "Home")</li>
                            <li>@Html.ActionLink("About", "About", "Home")</li>
                            <li>@Html.ActionLink("Students", "Index", "Student")</li>
                            <li>@Html.ActionLink("Courses", "Index", "Course")</li>
                            <li>@Html.ActionLink("Instructors", "Index", "Instructor")</li>
                            <li>@Html.ActionLink("Departments", "Index", "Department")</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    
        <div class="container">
            @RenderBody()
            <hr />
            <footer>
                <p>&copy; @DateTime.Now.Year - Contoso University</p>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html>
    
  2. Views\Home\Index.cshtml içinde, ASP.NET ve MVC hakkındaki metni bu uygulamayla ilgili metinle değiştirmek için dosyanın içeriğini aşağıdaki kodla değiştirin:

    @{
        ViewBag.Title = "Home Page";
    }
    
    <div class="jumbotron">
        <h1>Contoso University</h1>
    </div>
    <div class="row">
        <div class="col-md-4">
            <h2>Welcome to Contoso University</h2>
            <p>Contoso University is a sample application that
            demonstrates how to use Entity Framework 6 in an 
            ASP.NET MVC 5 web application.</p>
        </div>
        <div class="col-md-4">
            <h2>Build it from scratch</h2>
            <p>You can build the application by following the steps in the tutorial series on the ASP.NET site.</p>
            <p><a class="btn btn-default" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/">See the tutorial &raquo;</a></p>
        </div>
        <div class="col-md-4">
            <h2>Download it</h2>
            <p>You can download the completed project.</p>
            <p><a class="btn btn-default" href="https://webpifeed.blob.core.windows.net/webpifeed/Partners/ASP.NET%20MVC%20Application%20Using%20Entity%20Framework%20Code%20First.zip">Download &raquo;</a></p>
        </div>
    </div>
    
  3. Web sitesini çalıştırmak için Ctrl+F5 tuşlarına basın. Ana menünün olduğu giriş sayfasını görürsünüz.

Entity Framework 6'yi yükleme

  1. Araçlar menüsünde NuGet Paket Yöneticisi'ı ve ardından Konsol'u Paket Yöneticisi seçin.

  2. Paket Yöneticisi Konsolu penceresinde aşağıdaki komutu girin:

    Install-Package EntityFramework
    

Bu adım, bu öğreticide el ile yapmanız gereken birkaç adımdan biridir, ancak bu işlem ASP.NET MVC iskelesi özelliği tarafından otomatik olarak yapılmış olabilir. Entity Framework (EF) kullanmak için gereken adımları görebilmek için bunları el ile yapıyorsunuz. MVC denetleyicisini ve görünümlerini oluşturmak için iskeleyi daha sonra kullanacaksınız. Bunun alternatifi, yapı iskelesinin EF NuGet paketini otomatik olarak yüklemesine, veritabanı bağlam sınıfını oluşturmasına ve bağlantı dizesi oluşturmasına izin vermektir. Bu şekilde yapmaya hazır olduğunuzda, tek yapmanız gereken bu adımları atlamak ve varlık sınıflarınızı oluşturduktan sonra MVC denetleyicinizin iskelesini oluşturmaktır.

Veri modelini oluşturma

Daha sonra Contoso Üniversitesi uygulaması için varlık sınıfları oluşturacaksınız. Aşağıdaki üç varlıkla başlayacaksınız:

Kurs-Kayıt-Öğrenci<><>

Varlıklar İlişki
Kurs-Kayıt Bir-çok
Öğrenciden Kayda Bir-çok

varlıklar arasında Student Enrollment bire çok ilişkisi ve varlıklar arasında Course Enrollment bire çok ilişkisi vardır. Başka bir deyişle, bir öğrenci herhangi bir sayıda kursa kaydedilebilir ve bir kursta kayıtlı herhangi bir sayıda öğrenci olabilir.

Aşağıdaki bölümlerde, bu varlıkların her biri için bir sınıf oluşturacaksınız.

Not

Bu varlık sınıflarının tümünü oluşturmayı tamamlamadan önce projeyi derlemeye çalışırsanız, derleyici hataları alırsınız.

Student varlığı

  • Models klasöründe, Çözüm Gezgini klasörüne sağ tıklayıp Sınıf Ekle'yi>seçerek Student.cs adlı bir sınıf dosyası oluşturun. Şablon kodunu aşağıdaki kodla değiştirin:

    using System;
    using System.Collections.Generic;
    
    namespace ContosoUniversity.Models
    {
        public class Student
        {
            public int ID { get; set; }
            public string LastName { get; set; }
            public string FirstMidName { get; set; }
            public DateTime EnrollmentDate { get; set; }
            
            public virtual ICollection<Enrollment> Enrollments { get; set; }
        }
    }
    

özelliği, ID veritabanı tablosunun bu sınıfa karşılık gelen birincil anahtar sütunu olur. Varsayılan olarak, Entity Framework veya classname ID adlı ID bir özelliği birincil anahtar olarak yorumlar.

Enrollments özelliği bir gezinti özelliğidir. Gezinti özellikleri, bu varlıkla ilgili diğer varlıkları barındırır. Bu durumda, bir varlığın Enrollments özelliği bu varlıkla ilgili Student tüm Enrollment varlıkları barındırır.Student Başka bir deyişle, veritabanındaki belirli Student bir satırda ilişkili Enrollment iki satır varsa (yabancı anahtar sütununda o öğrencinin birincil anahtar değerini içeren satırlar StudentID ), bu varlığın Student Enrollments gezinti özelliği bu iki Enrollment varlığı içerir.

Gezinti özellikleri genellikle olarak virtual tanımlanır, böylece gecikmeli yükleme gibi belirli Entity Framework işlevselliğinden yararlanabilirler. (Gecikmeli yükleme daha sonraBu serinin devamında İlgili Verileri Okuma öğreticisi.)

Bir gezinti özelliği birden çok varlığı barındırabiliyorsa (çoka çok veya bire çok ilişkilerde olduğu gibi), türü gibi girdilerin eklenebileceği, silinebileceği ve güncelleştirilebileceği ICollectionbir liste olmalıdır.

Kayıt varlığı

  • Modeller klasöründe Enrollment.cs oluşturun ve mevcut kodu aşağıdaki kodla değiştirin:

    namespace ContosoUniversity.Models
    {
        public enum Grade
        {
            A, B, C, D, F
        }
    
        public class Enrollment
        {
            public int EnrollmentID { get; set; }
            public int CourseID { get; set; }
            public int StudentID { get; set; }
            public Grade? Grade { get; set; }
            
            public virtual Course Course { get; set; }
            public virtual Student Student { get; set; }
        }
    }
    

EnrollmentID özelliği birincil anahtar olacaktır; bu varlık, varlıkta gördüğünüz gibi kendi başına değil ID sınıf adı ID desenini Student kullanır. Normalde tek bir desen seçer ve bunu veri modeliniz boyunca kullanabilirsiniz. Burada çeşitleme, her iki deseni de kullanabileceğinizi gösterir. Sonraki bir öğreticide, kullanmadan classname kullanmanın ID veri modelinde devralmayı uygulamayı nasıl kolaylaştırdiğini göreceksiniz.

Grade özelliği bir sabit listesidir. Tür bildiriminden Grade sonraki soru işareti özelliğin Grade null atanabilir olduğunu gösterir. Null olan bir not sıfırdan farklıdır; null değeri, notların bilinmediği veya henüz atanmadığı anlamına gelir.

StudentID özelliği bir yabancı anahtardır ve buna karşılık gelen gezinti özelliği şeklindedirStudent. Bir Enrollment varlık bir Student varlıkla ilişkilendirildiğinden özellik yalnızca tek Student bir varlığı barındırabilir (daha önce gördüğünüz gezinti özelliğinin Student.Enrollments aksine, birden çok Enrollment varlığı barındırabilir).

CourseID özelliği bir yabancı anahtardır ve buna karşılık gelen gezinti özelliği şeklindedirCourse. Bir Enrollment varlık bir Course varlıkla ilişkilendirilir.

Entity Framework, bir özelliğin adı <gezinti özelliği adı birincil anahtar özellik adıysa><> (örneğin, StudentID varlığın Student birincil anahtarı olduğundan gezinti özelliği Student için) yabancı anahtar özelliği IDolarak yorumlar. Yabancı anahtar özellikleri aynı basit <birincil anahtar özellik adıyla> da adlandırılabilir (örneğin, CourseID varlığın Course birincil anahtarı olduğu CourseIDiçin).

Kurs varlığı

  • Modeller klasöründe, şablon kodunu aşağıdaki kodla değiştirerek Course.cs oluşturun:

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace ContosoUniversity.Models
    {
        public class Course
        {
            [DatabaseGenerated(DatabaseGeneratedOption.None)]
            public int CourseID { get; set; }
            public string Title { get; set; }
            public int Credits { get; set; }
            
            public virtual ICollection<Enrollment> Enrollments { get; set; }
        }
    }
    

Enrollments özelliği bir gezinti özelliğidir. Bir Course varlık, herhangi bir sayıda Enrollment varlıkla ilişkilendirilebilir.

Bu serinin DatabaseGeneratedAttribute sonraki öğreticilerinde özniteliği hakkında daha fazla bilgi vereceğiz. Temel olarak, bu öznitelik veritabanının oluşturması yerine kursun birincil anahtarını girmenizi sağlar.

Veritabanı bağlamı oluşturma

Belirli bir veri modeli için Entity Framework işlevselliğini koordine eden ana sınıf, veritabanı bağlam sınıfıdır. Bu sınıfı System.Data.Entity.DbContext sınıfından türeterek oluşturursunuz. Kodunuzda, veri modeline hangi varlıkların dahil olduğunu belirtirsiniz. Ayrıca belirli Entity Framework davranışını özelleştirebilirsiniz. Bu projede sınıfı olarak adlandırılır SchoolContext.

  • ContosoUniversity projesinde klasör oluşturmak için, Çözüm Gezgini'da projeye sağ tıklayın ve Ekle'ye tıklayın ve ardından Yeni Klasör'e tıklayın. Yeni klasöre DAL adını verin (Veri Erişim Katmanı için). Bu klasörde, SchoolContext.cs adlı yeni bir sınıf dosyası oluşturun ve şablon kodunu aşağıdaki kodla değiştirin:

    using ContosoUniversity.Models;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolContext : DbContext
        {
        
            public SchoolContext() : base("SchoolContext")
            {
            }
            
            public DbSet<Student> Students { get; set; }
            public DbSet<Enrollment> Enrollments { get; set; }
            public DbSet<Course> Courses { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }
        }
    }
    

Varlık kümelerini belirtme

Bu kod, her varlık kümesi için bir DbSet özelliği oluşturur. Entity Framework terminolojisinde varlık kümesi genellikle bir veritabanı tablosuna, varlık ise tablodaki bir satıra karşılık gelir.

Not

ve DbSet<Course> deyimlerini atlayabilirsiniz DbSet<Enrollment> ve aynı şekilde çalışır. Varlık varlığa, varlık da varlığa Enrollment başvuracağından Course Student Enrollment, Entity Framework bunları örtük olarak içerebilir.

bağlantı dizesi belirtin

oluşturucuya bağlantı dizesi adı (daha sonra Web.config dosyasına ekleyeceğiniz ad) geçirilir.

public SchoolContext() : base("SchoolContext")
{
}

Web.config dosyasında depolanan adı yerine bağlantı dizesi de geçirebilirsiniz. Kullanılacak veritabanını belirtme seçenekleri hakkında daha fazla bilgi için bkz . Bağlantı dizeleri ve modelleri.

Açıkça bir bağlantı dizesi veya adı belirtmezseniz, Entity Framework bağlantı dizesi adının sınıf adıyla aynı olduğunu varsayar. Bu örnekteki varsayılan bağlantı dizesi adı, açıkça belirttiğiniz adla aynı olacaktırSchoolContext.

Tekil tablo adlarını belirtme

modelBuilder.Conventions.Remove OnModelCreating yöntemindeki deyimi, tablo adlarının çoğullaştırılmasını engeller. Bunu yapmadıysanız veritabanında oluşturulan tablolar , Coursesve Enrollmentsolarak adlandırılırStudents. Bunun yerine, tablo adları , Courseve EnrollmentolurStudent. Geliştiriciler tablo adlarının çoğullaştırılıp çoğullaştırılmaması konusunda aynı fikirde değildir. Bu öğreticide tekil form kullanılır, ancak önemli olan nokta, bu kod satırını ekleyerek veya atlayarak hangi formu tercih ettiğinizi seçebilmenizdir.

Veritabanı'nın test verileriyle başlatılması

Entity Framework, uygulama çalıştırıldığında sizin için otomatik olarak bir veritabanı oluşturabilir (veya bırakıp yeniden oluşturabilir). Bunun, uygulamanız her çalıştığında veya yalnızca model mevcut veritabanıyla eşitlenmemiş olduğunda yapılması gerektiğini belirtebilirsiniz. Veritabanını test verileriyle doldurmak için Entity Framework'ün veritabanını oluşturduktan sonra otomatik olarak çağıran bir Seed yöntem de yazabilirsiniz.

Varsayılan davranış, yalnızca mevcut olmayan bir veritabanı oluşturmaktır (ve model değişmişse ve veritabanı zaten mevcutsa bir özel durum oluşturur). Bu bölümde, model her değiştiğinde veritabanının bırakılması ve yeniden oluşturulması gerektiğini belirteceksiniz. Veritabanını bırakmak tüm verilerinizin kaybolmasına neden olur. Veritabanı yeniden oluşturulduğunda yöntemi çalıştırılacağı ve test verilerinizi yeniden oluşturacağı için Seed bu genellikle geliştirme sırasında sorun olmaz. Ancak üretimde genellikle veritabanı şemasını her değiştirmeniz gerektiğinde tüm verilerinizi kaybetmek istemezsiniz. Daha sonra, veritabanını bırakmak ve yeniden oluşturmak yerine veritabanı şemasını değiştirmek için Code First Migrations kullanarak model değişikliklerini nasıl işleneceğini göreceksiniz.

  1. DAL klasöründe, SchoolInitializer.cs adlı yeni bir sınıf dosyası oluşturun ve şablon kodunu aşağıdaki kodla değiştirin; bu da gerektiğinde veritabanının oluşturulmasına neden olur ve test verilerini yeni veritabanına yükler.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using ContosoUniversity.Models;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>
        {
            protected override void Seed(SchoolContext context)
            {
                var students = new List<Student>
                {
                new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
                new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
                new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
                };
    
                students.ForEach(s => context.Students.Add(s));
                context.SaveChanges();
                var courses = new List<Course>
                {
                new Course{CourseID=1050,Title="Chemistry",Credits=3,},
                new Course{CourseID=4022,Title="Microeconomics",Credits=3,},
                new Course{CourseID=4041,Title="Macroeconomics",Credits=3,},
                new Course{CourseID=1045,Title="Calculus",Credits=4,},
                new Course{CourseID=3141,Title="Trigonometry",Credits=4,},
                new Course{CourseID=2021,Title="Composition",Credits=3,},
                new Course{CourseID=2042,Title="Literature",Credits=4,}
                };
                courses.ForEach(s => context.Courses.Add(s));
                context.SaveChanges();
                var enrollments = new List<Enrollment>
                {
                new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
                new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
                new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
                new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
                new Enrollment{StudentID=3,CourseID=1050},
                new Enrollment{StudentID=4,CourseID=1050,},
                new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
                new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
                new Enrollment{StudentID=6,CourseID=1045},
                new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
                };
                enrollments.ForEach(s => context.Enrollments.Add(s));
                context.SaveChanges();
            }
        }
    }
    

    Seed yöntemi, veritabanı bağlam nesnesini giriş parametresi olarak alır ve yöntemindeki kod veritabanına yeni varlıklar eklemek için bu nesneyi kullanır. Kod, her varlık türü için yeni varlıklardan oluşan bir koleksiyon oluşturur, bunları uygun DbSet özelliğe ekler ve sonra değişiklikleri veritabanına kaydeder. Burada olduğu gibi her varlık grubundan SaveChanges sonra yöntemini çağırmak gerekli değildir, ancak bunu yapmak, kod veritabanına yazarken bir özel durum oluşursa sorunun kaynağını bulmanıza yardımcı olur.

  2. Entity Framework'e başlatıcı sınıfınızı kullanmasını bildirmek için entityFramework , aşağıdaki örnekte gösterildiği gibi uygulama Web.config dosyasındaki öğesine (kök proje klasöründeki öğe) bir öğe ekleyin:

    <entityFramework>
      <contexts>
        <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
          <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
        </context>
      </contexts>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="v11.0" />
        </parameters>
      </defaultConnectionFactory>
      <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
    </entityFramework>
    

    tam context type bağlam sınıfı adını ve içinde olduğu derlemeyi belirtir ve databaseinitializer type başlatıcı sınıfının ve içinde olduğu derlemenin tam adını belirtir. (EF'nin başlatıcıyı kullanmasını istemediğinizde, öğesinde context bir öznitelik ayarlayabilirsiniz: disableDatabaseInitialization="true".) Daha fazla bilgi için bkz . Yapılandırma Dosyası Ayarları.

    Web.config dosyasında başlatıcıyı ayarlamanın bir alternatifi, Global.asax.cs dosyasında yöntemine Application_Start bir Database.SetInitializer deyim ekleyerek bunu kodda yapmaktır. Daha fazla bilgi için bkz . Önce Entity Framework Code'da Veritabanı Başlatıcılarını Anlama.

Uygulama artık belirli bir uygulama çalıştırmasında veritabanına ilk kez eriştiğinizde Entity Framework veritabanını modelle (sizin ve varlık sınıflarınız SchoolContext ) karşılaştıracak şekilde ayarlanmıştır. Bir fark varsa, uygulama veritabanını bırakır ve yeniden oluşturur.

Not

Bir uygulamayı üretim web sunucusuna dağıttığınızda, veritabanını kaldırıp yeniden oluşturan kodu kaldırmanız veya devre dışı bırakmanız gerekir. Bunu bu serinin sonraki öğreticilerinde yapacaksınız.

EF 6'yı LocalDB kullanacak şekilde ayarlama

LocalDB , SQL Server Express veritabanı altyapısının basit bir sürümüdür. Kolayca yüklenip yapılandırılabilir, isteğe bağlı olarak başlatılır ve kullanıcı modunda çalışır. LocalDB, veritabanlarıyla .mdf dosyaları olarak çalışmanızı sağlayan özel bir SQL Server Express yürütme modunda çalışır. Veritabanını projeyle birlikte kopyalayabilmek istiyorsanız LocalDB veritabanı dosyalarını web projesinin App_Data klasörüne yerleştirebilirsiniz. SQL Server Express'teki kullanıcı örneği özelliği, .mdf dosyalarla çalışmanızı da sağlar, ancak kullanıcı örneği özelliği kullanım dışıdır; bu nedenle, .mdf dosyalarıyla çalışmak için LocalDB önerilir. LocalDB, Visual Studio ile varsayılan olarak yüklenir.

SQL Server Express genellikle üretim web uygulamaları için kullanılmaz. LocalDB özellikle bir web uygulamasıyla üretim kullanımı için önerilmez çünkü IIS ile çalışacak şekilde tasarlanmamıştır.

  • Bu öğreticide LocalDB ile çalışacaksınız. Aşağıdaki örnekte gösterildiği gibi application Web.config dosyasını açın ve öğesinin appSettings önüne bir connectionStrings öğe ekleyin. (Güncelleştirme yaptığınızdan emin olunKök proje klasöründeki Web.config dosyası. Görünümler alt klasöründe güncelleştirmeniz gerekmeyen bir Web.config dosyası da vardır.)

    <connectionStrings>
        <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="webpages:Enabled" value="false" />
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    

Eklediğiniz bağlantı dizesi, Entity Framework'ün ContosoUniversity1.mdf adlı bir LocalDB veritabanı kullanacağını belirtir. (Veritabanı henüz mevcut değil, ancak EF bunu oluşturacak.) veritabanını App_Data klasörünüzde oluşturmak istiyorsanız, bağlantı dizesi ekleyebilirsinizAttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf. bağlantı dizesi hakkında daha fazla bilgi için bkz. ASP.NET Web Uygulamaları için SQL Server Bağlantı Dizeleri.

Web.config dosyasında bir bağlantı dizesi ihtiyacınız yoktur. bağlantı dizesi sağlamazsanız, Entity Framework bağlam sınıfınızı temel alan varsayılan bir bağlantı dizesi kullanır. Daha fazla bilgi için bkz . Yeni Veritabanına İlk Kod.

Denetleyici ve görünüm oluşturma

Şimdi verileri görüntülemek için bir web sayfası oluşturacaksınız. Verileri isteme işlemi otomatik olarak veritabanının oluşturulmasını tetikler. Yeni bir denetleyici oluşturarak başlayacaksınız. Ancak bunu gerçekleştirmeden önce, modeli ve bağlam sınıflarını MVC denetleyicisi iskelesi için kullanılabilir hale getirmek için projeyi derleyin.

  1. Çözüm Gezgini'da Denetleyiciler klasörüne sağ tıklayın, Ekle'yi seçin ve ardından Yeni İskeleli Öğe'ye tıklayın.

  2. yapı iskelesi ekle iletişim kutusunda, Entity Framework kullanarak görünümlere sahip MVC 5 Denetleyicisi'ni seçin ve ardından Ekle'yi seçin.

    Visual Studio'da İskele Ekle iletişim kutusu

  3. Denetleyici Ekle iletişim kutusunda aşağıdaki seçimleri yapın ve ekle'yi seçin:

    • Model sınıfı: Öğrenci (ContosoUniversity.Models). (Açılan listede bu seçeneği görmüyorsanız projeyi derleyin ve yeniden deneyin.)

    • Veri bağlamı sınıfı: SchoolContext (ContosoUniversity.DAL).

    • Denetleyici adı: StudentController (StudentsController değil).

    • Diğer alanlar için varsayılan değerleri bırakın.

      Ekle'ye tıkladığınızda, iskele bir StudentController.cs dosyası ve denetleyiciyle çalışan bir görünüm kümesi (.cshtml dosyaları) oluşturur. İleride Entity Framework kullanan projeler oluştururken, iskelenin bazı ek işlevlerinden de yararlanabilirsiniz: ilk model sınıfınızı oluşturun, bir bağlantı dizesi oluşturmayın ve ardından Denetleyici Ekle kutusunda Veri bağlamı sınıfının yanındaki düğmeyi seçerek + Yeni veri bağlamı belirtin. yapı iskelesi sınıfınızı DbContext ve bağlantı dizesi yanı sıra denetleyiciyi ve görünümleri oluşturur.

  4. Visual Studio Controllers\StudentController.cs dosyasını açar. Veritabanı bağlam nesnesinin örneğini oluşturan bir sınıf değişkeni oluşturulduğunu görürsünüz:

    private SchoolContext db = new SchoolContext();
    

    Eylem yöntemi, Index veritabanı bağlam örneğinin özelliğini okuyarak Students Öğrenciler varlık kümesinden öğrencilerin listesini alır:

    public ViewResult Index()
    {
        return View(db.Students.ToList());
    }
    

    Student\Index.cshtml görünümü bu listeyi bir tabloda görüntüler:

    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.LastName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FirstMidName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.EnrollmentDate)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>
    }
    
  5. Projeyi çalıştırmak için Ctrl+F5 tuşlarına basın. ("Gölge Kopya oluşturulamıyor" hatası alırsanız tarayıcıyı kapatın ve yeniden deneyin.)

    Yöntemin eklendiği test verilerini görmek için Öğrenciler sekmesine Seed tıklayın. Tarayıcı pencerenizin ne kadar dar olduğuna bağlı olarak, üst adres çubuğunda Öğrenci sekmesi bağlantısını görürsünüz veya bağlantıyı görmek için sağ üst köşeye tıklamanız gerekir.

    Menü düğmesi

Veritabanını görüntüleme

Öğrenciler sayfasını çalıştırdığınızda ve uygulama veritabanına erişmeye çalıştığında, EF veritabanı olmadığını keşfetti ve bir veritabanı oluşturdu. EF daha sonra veritabanını verilerle doldurmak için seed yöntemini çalıştırdı.

Veritabanını Visual Studio'da görüntülemek için Sunucu Gezgini veya SQL Server Nesne Gezgini (SSOX) kullanabilirsiniz. Bu öğreticide Sunucu Gezgini'ni kullanacaksınız.

  1. Tarayıcıyı kapatın.

  2. Sunucu Gezgini'nde Veri Bağlantıları'nı genişletin (önce yenile düğmesini seçmeniz gerekebilir), Okul Bağlamı 'nı (ContosoUniversity) genişletin ve sonra yeni veritabanınızdaki tabloları görmek için Tablolar'ı genişletin.

  3. Oluşturulan sütunları ve tabloya eklenen satırları görmek için Öğrenci tablosuna sağ tıklayın ve Tablo Verilerini Göster'e tıklayın.

  4. Sunucu Gezgini bağlantısını kapatın.

ContosoUniversity1.mdf ve .ldf veritabanı dosyaları %USERPROFILE% klasöründedir.

Başlatıcıyı kullandığınızdan DropCreateDatabaseIfModelChanges , artık sınıfında bir değişiklik Student yapabilir, uygulamayı yeniden çalıştırabilir ve veritabanı değişikliğinizle eşleşecek şekilde otomatik olarak yeniden oluşturulur. Örneğin, sınıfa Student bir EmailAddress özellik ekler, Öğrenciler sayfasını yeniden çalıştırır ve sonra tabloya yeniden bakarsanız yeni EmailAddress bir sütun görürsünüz.

Kurallar

Entity Framework'ün sizin için eksiksiz bir veritabanı oluşturabilmesi için yazmanız gereken kod miktarı, Entity Framework'ün yaptığı kurallar veya varsayımlar nedeniyle çok azdır. Bunlardan bazıları önceden not edilmiştir veya sizin haberiniz olmadan kullanılmıştır:

  • Varlık sınıfı adlarının çoğullaştırılmış formları tablo adları olarak kullanılır.
  • Varlık özelliği adları sütun adları için kullanılır.
  • veya classname ID adlı ID varlık özellikleri birincil anahtar özellikleri olarak kabul edilir.
  • Bir özellik, gezinti özelliği adı birincil anahtar özellik adıysa <>><(örneğin, StudentID varlığın Student birincil anahtarı olduğundan gezinti özelliği Student için) yabancı anahtar özelliği olarak yorumlanır.ID Yabancı anahtar özellikleri aynı basit <birincil anahtar özellik adıyla> da adlandırılabilir (örneğin, EnrollmentID varlığın Enrollment birincil anahtarı olduğu EnrollmentIDiçin).

Kuralların geçersiz kılınabileceğini gördünüz. Örneğin, tablo adlarının çoğullaştırılmaması gerektiğini belirttiniz ve daha sonra bir özelliği açıkça yabancı anahtar özelliği olarak işaretlemeyi göreceksiniz.

Kodu alma

Tamamlanan Projeyi İndir

Ek kaynaklar

EF 6 hakkında daha fazla bilgi için şu makalelere bakın:

Sonraki adımlar

Bu öğreticide şunları yaptınız:

  • MVC web uygulaması oluşturuldu
  • Site stilini ayarlama
  • Yüklü Entity Framework 6
  • Veri modeli oluşturuldu
  • Veritabanı bağlamı oluşturuldu
  • Test verileriyle başlatılan VERITABANı
  • EF 6'yı LocalDB kullanacak şekilde ayarlama
  • Denetleyici ve görünümler oluşturuldu
  • Veritabanı görüntülendi

Denetleyicilerinizde ve görünümlerinizde oluşturma, okuma, güncelleştirme, silme (CRUD) kodunu gözden geçirmeyi ve özelleştirmeyi öğrenmek için sonraki makaleye ilerleyin.