Aracılığıyla paylaş


Öğretici: ASP.NET MVC uygulamasında EF Geçişlerini kullanma ve Azure'a dağıtma

Şimdiye kadar Contoso Üniversitesi örnek web uygulaması geliştirme bilgisayarınızdaki IIS Express yerel olarak çalıştırılıyordu. Gerçek bir uygulamayı diğer kişilerin İnternet üzerinden kullanabilmesi için bir web barındırma sağlayıcısına dağıtmanız gerekir. Bu öğreticide Code First geçişlerini etkinleştirecek ve uygulamayı Azure'da buluta dağıtacaksınız:

  • Code First Migrations etkinleştirin. Geçişler özelliği, veritabanını bırakıp yeniden oluşturmak zorunda kalmadan veritabanı şemasını güncelleştirerek veri modelini değiştirmenize ve değişikliklerinizi üretim ortamına dağıtmanıza olanak tanır.
  • Azure'a dağıtma. Bu adım isteğe bağlıdır; projeyi dağıtmadan kalan öğreticilerle devam edebilirsiniz.

Dağıtım için kaynak denetimiyle sürekli tümleştirme işlemi kullanmanızı öneririz, ancak bu öğretici bu konuları kapsamaz. Daha fazla bilgi için Azure ile Cloud Apps oluşturma Real-Worldkaynak denetimi ve sürekli tümleştirme bölümlerine bakın.

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

  • Code First geçişlerini etkinleştirme
  • Uygulamayı Azure'da dağıtma (isteğe bağlı)

Önkoşullar

Code First geçişlerini etkinleştirme

Yeni bir uygulama geliştirirken veri modeliniz sık sık değişir ve model her değiştiğinde veritabanıyla eşitlenmez. Entity Framework'ünü, veri modelini her değiştirdiğinizde veritabanını otomatik olarak bırakacak ve yeniden oluşturacak şekilde yapılandırmışsınız. Varlık sınıflarını eklediğinizde, kaldırdığınızda veya değiştirdiğinizde ya da sınıfınızı DbContext değiştirdiğinizde, uygulamayı bir sonraki çalıştırmanızda mevcut veritabanınız otomatik olarak silinir, modelle eşleşen yeni bir veritabanı oluşturulur ve test verileriyle bu sınıfa tohumlar.

Veritabanını veri modeliyle eşitlenmiş halde tutmanın bu yöntemi, uygulamayı üretim ortamına dağıtana kadar iyi çalışır. Uygulama üretimde çalışırken, genellikle saklamak istediğiniz verileri depolar ve yeni sütun ekleme gibi her değişiklik yaptığınızda her şeyi kaybetmek istemezsiniz. Code First Migrations özelliği, veritabanını bırakıp yeniden oluşturmak yerine veritabanı şemasını güncelleştirmek için Code First'ı etkinleştirerek bu sorunu çözer. Bu öğreticide uygulamayı dağıtacak ve buna hazırlanmak için Geçişleri etkinleştireceksiniz.

  1. Uygulama Web.config dosyasına eklediğiniz öğeyi contexts açıklama satırı yaparak veya silerek daha önce ayarladığınız başlatıcıyı devre dışı bırakın.

    <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>
    
  2. Ayrıca uygulama Web.config dosyasında, bağlantı dizesindeki veritabanının adını ContosoUniversity2 olarak değiştirin.

    <connectionStrings>
      <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    Bu değişiklik, ilk geçişin yeni bir veritabanı oluşturması için projeyi ayarlar. Bu gerekli değildir, ancak daha sonra bunun neden iyi bir fikir olduğunu göreceksiniz.

  3. Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi>Konsolu'nu seçin.

  4. İstemde PM> aşağıdaki komutları girin:

    enable-migrations
    add-migration InitialCreate
    

    Komut ContosoUniversity enable-migrations projesinde bir Migrations klasörü oluşturur ve bu klasöre Geçişleri yapılandırmak için düzenleyebileceğiniz bir Configuration.cs dosyası yerleştirir.

    (Sizi veritabanı adını değiştirmeye yönlendiren yukarıdaki adımı kaçırdıysanız, Migrations var olan veritabanını bulur ve komutu otomatik olarak gerçekleştirir add-migration . Bu sorun değil, veritabanını dağıtmadan önce geçiş kodunun testini çalıştırmayacağınız anlamına gelir. Daha sonra komutunu çalıştırdığınızda update-database veritabanı zaten var olduğundan hiçbir şey olmaz.)

    ContosoUniversity\Migrations\Configuration.cs dosyasını açın. Daha önce gördüğünüz başlatıcı sınıfı gibi, Configuration sınıfı da bir Seed yöntem içerir.

    internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }
    
        protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
        {
            //  This method will be called after migrating to the latest version.
    
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
    

    Seed yönteminin amacı, Code First veritabanını oluşturarak veya güncelleştirdikten sonra test verilerini eklemenizi veya güncelleştirmenizi sağlamaktır. veritabanı oluşturulduğunda ve bir veri modeli değiştikten sonra veritabanı şeması her güncelleştirildiğinde yöntemi çağrılır.

Seed yöntemini ayarlama

Her veri modeli değişikliği için veritabanını bırakıp yeniden oluşturduğunuzda, test verilerini eklemek için başlatıcı sınıfının Seed yöntemini kullanırsınız çünkü her model değişikliğinden sonra veritabanı bırakılır ve tüm test verileri kaybolur. Code First Migrations ile test verileri veritabanı değişikliklerinden sonra korunur, bu nedenle test verilerinin Seed yöntemine dahil edilmesi genellikle gerekli değildir. Aslında, veritabanını üretime dağıtmak için Migrations'ı kullanacaksanız yönteminin test verileri eklemesini Seed istemezsinizSeed, çünkü yöntem üretimde çalışacaktır. Bu durumda, yönteminin Seed veritabanına yalnızca üretimde ihtiyacınız olan verileri eklemesini istersiniz. Örneğin, uygulama üretimde kullanılabilir olduğunda veritabanının tabloya Department gerçek departman adlarını eklemesini isteyebilirsiniz.

Bu öğreticide dağıtım için Geçişler'i kullanacaksınız, ancak yönteminiz Seed çok fazla veriyi el ile eklemek zorunda kalmadan uygulama işlevselliğinin nasıl çalıştığını görmeyi kolaylaştırmak için test verilerini yine de ekler.

  1. Configuration.cs dosyasının içeriğini, test verilerini yeni veritabanına yükleyen aşağıdaki kodla değiştirin.

    namespace ContosoUniversity.Migrations
    {
        using ContosoUniversity.Models;
        using System;
        using System.Collections.Generic;
        using System.Data.Entity;
        using System.Data.Entity.Migrations;
        using System.Linq;
    
        internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
        {
            public Configuration()
            {
                AutomaticMigrationsEnabled = false;
            }
    
            protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
            {
                var students = new List<Student>
                {
                    new Student { FirstMidName = "Carson",   LastName = "Alexander", 
                        EnrollmentDate = DateTime.Parse("2010-09-01") },
                    new Student { FirstMidName = "Meredith", LastName = "Alonso",    
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Arturo",   LastName = "Anand",     
                        EnrollmentDate = DateTime.Parse("2013-09-01") },
                    new Student { FirstMidName = "Gytis",    LastName = "Barzdukas", 
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Yan",      LastName = "Li",        
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Peggy",    LastName = "Justice",   
                        EnrollmentDate = DateTime.Parse("2011-09-01") },
                    new Student { FirstMidName = "Laura",    LastName = "Norman",    
                        EnrollmentDate = DateTime.Parse("2013-09-01") },
                    new Student { FirstMidName = "Nino",     LastName = "Olivetto",  
                        EnrollmentDate = DateTime.Parse("2005-08-11") }
                };
                students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, 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.AddOrUpdate(p => p.Title, s));
                context.SaveChanges();
    
                var enrollments = new List<Enrollment>
                {
                    new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").ID, 
                        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, 
                        Grade = Grade.A 
                    },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").ID,
                        CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID, 
                        Grade = Grade.C 
                     },                            
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").ID,
                        CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID, 
                        Grade = Grade.B
                     },
                     new Enrollment { 
                         StudentID = students.Single(s => s.LastName == "Alonso").ID,
                        CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment { 
                         StudentID = students.Single(s => s.LastName == "Alonso").ID,
                        CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment {
                        StudentID = students.Single(s => s.LastName == "Alonso").ID,
                        CourseID = courses.Single(c => c.Title == "Composition" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Anand").ID,
                        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Anand").ID,
                        CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID,
                        Grade = Grade.B         
                     },
                    new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Barzdukas").ID,
                        CourseID = courses.Single(c => c.Title == "Chemistry").CourseID,
                        Grade = Grade.B         
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Li").ID,
                        CourseID = courses.Single(c => c.Title == "Composition").CourseID,
                        Grade = Grade.B         
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Justice").ID,
                        CourseID = courses.Single(c => c.Title == "Literature").CourseID,
                        Grade = Grade.B         
                     }
                };
    
                foreach (Enrollment e in enrollments)
                {
                    var enrollmentInDataBase = context.Enrollments.Where(
                        s =>
                             s.Student.ID == e.StudentID &&
                             s.Course.CourseID == e.CourseID).SingleOrDefault();
                    if (enrollmentInDataBase == null)
                    {
                        context.Enrollments.Add(e);
                    }
                }
                context.SaveChanges();
            }
        }
    }
    

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

    Veri ekleyen deyimlerden bazıları, "upsert" işlemi gerçekleştirmek için AddOrUpdate yöntemini kullanır. Seed Komutu her yürütürken yöntemi çalıştığındanupdate-database, genellikle her geçişten sonra veri ekleyemezsiniz, çünkü eklemeye çalıştığınız satırlar veritabanını oluşturan ilk geçişten sonra zaten orada olacaktır. "upsert" işlemi, zaten var olan bir satır eklemeye çalıştığınızda oluşabilecek hataları önler, ancak uygulamayı test ederken yapmış olabileceğiniz verilerde yaptığınız değişiklikleri geçersiz kılar . Bazı tablolardaki test verileriyle bunun olmasını istemeyebilirsiniz: Bazı durumlarda, test sırasında verileri değiştirdiğinizde, veritabanı güncelleştirmelerinin ardından değişikliklerinizin kalmasını istersiniz. Bu durumda, koşullu ekleme işlemi yapmak istiyorsunuz: yalnızca henüz yoksa satır ekleyin. Seed yöntemi her iki yaklaşımı da kullanır.

    AddOrUpdate yöntemine geçirilen ilk parametre, bir satırın zaten var olup olmadığını denetlemek için kullanılacak özelliği belirtir. Sağladığınız test öğrenci verileri için, LastName listedeki her soyadı benzersiz olduğundan özellik bu amaçla kullanılabilir:

    context.Students.AddOrUpdate(p => p.LastName, s)
    

    Bu kod, soyadlarının benzersiz olduğunu varsayar. Soyadı yinelenen bir öğrenciyi el ile eklerseniz, bir sonraki geçiş işlemi için aşağıdaki özel durumu alırsınız:

    Sıra birden fazla öğe içeriyor

    "Alexander Carson" adlı iki öğrenci gibi yedekli verilerin nasıl işleneceği hakkında bilgi için Rick Anderson'un blogundaki Seeding and Debugging Entity Framework (EF) DB'lerine bakın. Yöntemi hakkında AddOrUpdate daha fazla bilgi için Julie Lerman'ın blogunda EF 4.3 AddOrUpdate Yöntemi ile ilgilenme bölümüne bakın.

    Varlıkları oluşturan kod, koleksiyonu oluşturan Enrollment kodda students bu özelliği ayarlamamış olmanıza rağmen koleksiyondaki varlıklarda değeriniz olduğunu varsayarID.

    new Enrollment { 
        StudentID = students.Single(s => s.LastName == "Alexander").ID, 
        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, 
        Grade = Grade.A 
    },
    

    Burada özelliğini kullanabilirsiniz ID çünkü ID koleksiyon için students çağırdığınızda SaveChanges değer ayarlanır. EF, veritabanına bir varlık eklediğinde birincil anahtar değerini otomatik olarak alır ve varlığın bellekteki özelliğini güncelleştirir ID .

    Varlık kümesine Enrollments her Enrollment varlığı ekleyen kod yöntemini AddOrUpdate kullanmaz. Bir varlığın zaten var olup olmadığını denetler ve yoksa varlığı ekler. Bu yaklaşım, uygulama kullanıcı arabirimini kullanarak kayıt notları için yaptığınız değişiklikleri korur. Kod, Listenin her üyesinde Enrollment döngü oluşturur ve kayıt veritabanında bulunamazsa kaydı veritabanına ekler. Veritabanını ilk kez güncelleştirdiğinizde veritabanı boş olur ve her kaydı ekler.

    foreach (Enrollment e in enrollments)
    {
        var enrollmentInDataBase = context.Enrollments.Where(
            s => s.Student.ID == e.Student.ID &&
                 s.Course.CourseID == e.Course.CourseID).SingleOrDefault();
        if (enrollmentInDataBase == null)
        {
            context.Enrollments.Add(e);
        }
    }
    
  2. Projeyi derleyin.

İlk geçişi yürütme

Komutunu yürütürken add-migration Migrations, veritabanını sıfırdan oluşturacak kodu oluşturdu. Bu kod ayrıca Migrations klasöründe, timestamp>_InitialCreate.cs adlı< dosyada yer alır. Up sınıfının yöntemiInitialCreate, veri modeli varlık kümelerine karşılık gelen veritabanı tablolarını oluşturur ve Down yöntemi bunları siler.

public partial class InitialCreate : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Course",
            c => new
                {
                    CourseID = c.Int(nullable: false),
                    Title = c.String(),
                    Credits = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.CourseID);
        
        CreateTable(
            "dbo.Enrollment",
            c => new
                {
                    EnrollmentID = c.Int(nullable: false, identity: true),
                    CourseID = c.Int(nullable: false),
                    StudentID = c.Int(nullable: false),
                    Grade = c.Int(),
                })
            .PrimaryKey(t => t.EnrollmentID)
            .ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: true)
            .ForeignKey("dbo.Student", t => t.StudentID, cascadeDelete: true)
            .Index(t => t.CourseID)
            .Index(t => t.StudentID);
        
        CreateTable(
            "dbo.Student",
            c => new
                {
                    ID = c.Int(nullable: false, identity: true),
                    LastName = c.String(),
                    FirstMidName = c.String(),
                    EnrollmentDate = c.DateTime(nullable: false),
                })
            .PrimaryKey(t => t.ID);
        
    }
    
    public override void Down()
    {
        DropForeignKey("dbo.Enrollment", "StudentID", "dbo.Student");
        DropForeignKey("dbo.Enrollment", "CourseID", "dbo.Course");
        DropIndex("dbo.Enrollment", new[] { "StudentID" });
        DropIndex("dbo.Enrollment", new[] { "CourseID" });
        DropTable("dbo.Student");
        DropTable("dbo.Enrollment");
        DropTable("dbo.Course");
    }
}

Geçişler, bir geçiş için veri modeli değişikliklerini uygulamak için yöntemini çağırır Up . Güncelleştirmeyi geri almak için bir komut girdiğinizde Migrations yöntemini çağırır Down .

Bu, komutu girdiğinizde oluşturulan ilk geçiştir add-migration InitialCreate . parametresi (InitialCreate örnekte) dosya adı için kullanılır ve istediğiniz gibi olabilir; genellikle geçişte yapılan işlemleri özetleyen bir sözcük veya tümcecik seçersiniz. Örneğin, sonraki bir geçişi "AddDepartmentTable" olarak adlandırabilirsiniz.

Veritabanı zaten mevcut olduğunda ilk geçişi oluşturduysanız, veritabanı oluşturma kodu oluşturulur, ancak veritabanı veri modeliyle zaten eşleştiğinden çalıştırılması gerekmez. Uygulamayı veritabanının henüz mevcut olmadığı başka bir ortama dağıttığınızda, bu kod veritabanınızı oluşturmak için çalıştırılır, bu nedenle önce test etmek iyi bir fikirdir. Bu nedenle, daha önce bağlantı dizesindeki veritabanının adını değiştirerek geçişlerin sıfırdan yeni bir tane oluşturabilmesini sağlayabilirsiniz.

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

    update-database

    update-database komutu veritabanını oluşturmak için yöntemini çalıştırır Up ve ardından veritabanını doldurmak için yöntemini çalıştırırSeed. Aşağıdaki bölümde göreceğiniz gibi, uygulamayı dağıttığınızda aynı işlem üretimde otomatik olarak çalıştırılır.

  2. İlk öğreticide yaptığınız gibi veritabanını incelemek için Sunucu Gezgini'ni kullanın ve her şeyin hala eskisi gibi çalıştığını doğrulamak için uygulamayı çalıştırın.

Azure’a dağıtın

Şimdiye kadar uygulama geliştirme bilgisayarınızdaki IIS Express yerel olarak çalışıyor. Diğer kişilerin İnternet üzerinden kullanabilmesi için bunu bir web barındırma sağlayıcısına dağıtmanız gerekir. Öğreticinin bu bölümünde, bunu Azure'a dağıtacaksınız. Bu bölüm isteğe bağlıdır; bunu atlayabilir ve aşağıdaki öğreticiye devam edebilir veya bu bölümdeki yönergeleri seçtiğiniz farklı bir barındırma sağlayıcısı için uyarlayabilirsiniz.

Veritabanını dağıtmak için Code First geçişlerini kullanma

Veritabanını dağıtmak için Code First Migrations kullanacaksınız. Visual Studio'dan dağıtım ayarlarını yapılandırmak için kullandığınız yayımlama profilini oluşturduğunuzda Veritabanını Güncelleştir etiketli bir onay kutusu seçersiniz. Bu ayar, dağıtım işleminin hedef sunucudaki uygulama Web.config dosyasını Code First'ın başlatıcı sınıfını kullanması için otomatik olarak yapılandırmasına MigrateDatabaseToLatestVersion neden olur.

Visual Studio, projenizi hedef sunucuya kopyalarken dağıtım işlemi sırasında veritabanıyla hiçbir şey yapmaz. Dağıtılan uygulamayı çalıştırdığınızda ve dağıtımdan sonra veritabanına ilk kez eriştiğinde, Code First veritabanının veri modeliyle eşleşip eşleşmediğini denetler. Uyuşmazlık varsa, Code First veritabanını otomatik olarak oluşturur (henüz yoksa) veya veritabanı şemasını en son sürüme güncelleştirir (veritabanı varsa ancak modelle eşleşmiyorsa). Uygulama bir Migrations Seed yöntemi uygularsa, veritabanı oluşturulduktan veya şema güncelleştirildikten sonra yöntem çalışır.

Migrations Seed yönteminiz test verileri ekler. Bir üretim ortamına dağıtıyorsanız, yalnızca üretim veritabanınıza eklenmesini istediğiniz verileri ekleyebilmesi için yöntemini değiştirmeniz Seed gerekirdi. Örneğin, geçerli veri modelinizde geliştirme veritabanında gerçek kurslara ancak kurgusal öğrencilere sahip olmak isteyebilirsiniz. Hem geliştirme aşamasında yüklemek için bir Seed yöntem yazabilir hem de üretime dağıtmadan önce kurgusal öğrencilere açıklama ekleyebilirsiniz. Ya da yalnızca kursları yüklemek için bir Seed yöntem yazabilir ve uygulamanın kullanıcı arabirimini kullanarak kurgusal öğrencileri test veritabanına el ile girebilirsiniz.

Azure hesabı alma

Bir Azure hesabınız olması gerekir. Henüz bir aboneliğiniz yoksa ancak Visual Studio aboneliğiniz varsa abonelik avantajlarınızı etkinleştirebilirsiniz. Aksi takdirde, yalnızca birkaç dakika içinde ücretsiz bir deneme hesabı oluşturabilirsiniz. Ayrıntılı bilgi için bkz. Azure Ücretsiz Deneme Sürümü.

Azure'da web sitesi ve SQL veritabanı oluşturma

Azure'daki web uygulamanız paylaşılan bir barındırma ortamında çalışır; bu da diğer Azure istemcileriyle paylaşılan sanal makinelerde (VM) çalıştırıldığı anlamına gelir. Paylaşılan barındırma ortamı, bulutta çalışmaya başlamanın düşük maliyetli bir yoludur. Daha sonra web trafiğiniz artarsa uygulama, ayrılmış VM'lerde çalıştırarak ihtiyacı karşılayacak şekilde ölçeklendirilebilir. Azure App Service fiyatlandırma seçenekleri hakkında daha fazla bilgi edinmek için fiyatlandırma App Service okuyun.

Veritabanını Azure SQL veritabanına dağıtacaksınız. SQL veritabanı, SQL Server teknolojileri temel alan bulut tabanlı bir ilişkisel veritabanı hizmetidir. SQL Server ile çalışan araçlar ve uygulamalar da SQL veritabanıyla çalışır.

  1. Azure Yönetim Portalı'nda sol sekmede Kaynak oluştur'u seçin ve ardından tüm kullanılabilir kaynakları görmek için Yeni bölmesinde (veya dikey penceresinde) Tümünü göster'i seçin. Her Şey dikey penceresinin Web bölümünde WebUygulaması + SQL'i seçin. Son olarak Oluştur'u seçin.

    Azure portalında kaynak oluşturma

    Yeni bir Yeni Web Uygulaması + SQL kaynağı oluşturma formu açılır.

  2. Uygulamanızın benzersiz URL'si olarak kullanmak üzere Uygulama adı kutusuna bir dize girin. Url'nin tamamı buraya girdiğinizden ve Azure Uygulaması Hizmetleri'nin (.azurewebsites.net) varsayılan etki alanından oluşur. Uygulama adı zaten alınmışsa, Sihirbaz size kırmızı bir uygulama adı kullanılamıyor iletisiyle bildirir. Uygulama adı kullanılabiliyorsa yeşil bir onay işareti görürsünüz.

  3. Abonelik kutusunda, App Service olmasını istediğiniz Azure Aboneliği'ni seçin.

  4. Kaynak Grubu metin kutusunda bir Kaynak Grubu seçin veya yeni bir grup oluşturun. Bu ayar, web sitenizin hangi veri merkezinde çalışacağını belirtir. Kaynak Grupları hakkında daha fazla bilgi için bkz. Kaynak grupları.

  5. App Service bölümüne, Yeni Oluştur'a tıklayarak yeni bir App Service Planı oluşturun ve App Service planı doldurun (App Service adıyla aynı olabilir), Konum ve Fiyatlandırma katmanı (ücretsiz bir seçenek vardır).

  6. SQL Veritabanı'e tıklayın ve ardından Yeni veritabanı oluştur'u veya var olan bir veritabanını seçin.

  7. Ad kutusuna veritabanınız için bir ad girin.

  8. Hedef Sunucu kutusuna tıklayın ve ardından Yeni sunucu oluştur'u seçin. Alternatif olarak, daha önce bir sunucu oluşturduysanız, kullanılabilir sunucular listesinden bu sunucuyu seçebilirsiniz.

  9. Fiyatlandırma katmanı bölümünü seçin, Ücretsiz'i seçin. Ek kaynaklar gerekirse, veritabanının ölçeği istediğiniz zaman artırılabilir. Azure SQL Fiyatlandırması hakkında daha fazla bilgi edinmek için bkz. Azure SQL Veritabanı fiyatlandırması.

  10. Harmanlamayı gerektiği gibi değiştirin.

  11. Yönetici SQL Yönetici Kullanıcı Adı ve SQL Yönetici Parolası girin.

    • Yeni SQL Veritabanı sunucusu'nu seçtiyseniz, daha sonra veritabanına erişirken kullanacağınız yeni bir ad ve parola tanımlayın.
    • Daha önce oluşturduğunuz bir sunucuyu seçtiyseniz, o sunucunun kimlik bilgilerini girin.
  12. Telemetri koleksiyonu Application Insights kullanılarak App Service için etkinleştirilebilir. Application Insights çok az yapılandırmayla değerli olay, özel durum, bağımlılık, istek ve izleme bilgilerini toplar. Application Insights hakkında daha fazla bilgi edinmek için bkz. Azure İzleyici.

  13. İşinizin bittiğini belirtmek için alt kısımdaki Oluştur'a tıklayın.

    Yönetim Portalı Pano sayfasına döner ve sayfanın en üstündeki Bildirimler alanı sitenin oluşturulduğunu gösterir. Bir süre sonra (genellikle bir dakikadan kısa), Dağıtımın başarılı olduğuna ilişkin bir bildirim vardır. Sol taraftaki gezinti çubuğunda, yeni App Service App Services bölümünde, yeni SQL veritabanı ise SQL veritabanları bölümünde görünür.

Uygulamayı Azure’da dağıtma

  1. Visual Studio'da, Çözüm Gezgini'da projeye sağ tıklayın ve bağlam menüsünden Yayımla'yı seçin.

  2. Yayımlama hedefi seçin sayfasında App Service ve ardından Var Olanı Seç'i ve ardından Yayımla'yı seçin.

    Yayımlama hedefi sayfası seçin

  3. Daha önce Visual Studio'da Azure aboneliğinizi eklemediyseniz ekrandaki adımları gerçekleştirin. Bu adımlar, App Services listesinin web sitenizi içermesi için Visual Studio'nun Azure aboneliğinize bağlanmasını sağlar.

  4. App Service sayfasında, App Service eklediğiniz Aboneliği seçin. Görünüm'in altında Kaynak Grubu'u seçin. App Service eklediğiniz kaynak grubunu genişletin ve ardından App Service seçin. Uygulamayı yayımlamak için Tamam'ı seçin.

  5. Çıkış penceresinde hangi dağıtım eylemlerinin gerçekleştirildiği gösterilir ve dağıtımın başarıyla tamamlandığını bildirir.

  6. Dağıtım başarılı olursa, varsayılan tarayıcı dağıtılan web sitesinin URL'sine otomatik olarak açılır.

    Students_index_page_with_paging

    Uygulamanız artık bulutta çalışıyor.

Bu noktada, Azure SQL veritabanında SchoolContext veritabanı oluşturulmuştur çünkü Code First Migrations Yürüt'i (uygulama başlangıcında çalışır) seçtiniz. Dağıtılan web sitesindeki Web.config dosyası, kodunuz veritabanındaki verileri ilk kez okuduğunda veya yazdığında MigrateDatabaseToLatestVersion başlatıcısının çalışması için değiştirildi ( Öğrenciler sekmesini seçtiğinizde oluştu):

Web.config dosya alıntısı

Dağıtım işlemi ayrıca veritabanı şemasını güncelleştirmek ve veritabanının dağıtımını yapmak için Code First Migrations için yeni bir bağlantı dizesi (SchoolContext_DatabasePublish) oluşturmuştur.

Web.config dosyasında bağlantı dizesi

Web.config dosyasının dağıtılan sürümünü ContosoUniversity\obj\Release\Package\PackageTmp\Web.config'da kendi bilgisayarınızda bulabilirsiniz. FTP kullanarak dağıtılan Web.config dosyasına erişebilirsiniz. Yönergeler için bkz. Visual Studio kullanarak Web Dağıtımı ASP.NET: Kod Güncelleştirmesi Dağıtma. "FTP aracı kullanmak için üç şeye ihtiyacınız vardır: FTP URL'si, kullanıcı adı ve parola" ile başlayan yönergeleri izleyin.

Not

Web uygulaması güvenlik uygulamaz, bu nedenle URL'yi bulan herkes verileri değiştirebilir. Web sitesinin güvenliğini sağlama yönergeleri için bkz. Üyelik, OAuth ve SQL veritabanı ile Güvenli ASP.NET MVC uygulamasını Azure'a dağıtma. Visual Studio'da Azure Yönetim Portalı'nı veya Sunucu Gezgini'ni kullanarak hizmeti durdurarak diğer kişilerin siteyi kullanmasını engelleyebilirsiniz.

App Service'i durdur menü öğesi

Gelişmiş geçiş senaryoları

Bu öğreticide gösterildiği gibi geçişleri otomatik olarak çalıştırarak bir veritabanı dağıtıyorsanız ve birden çok sunucuda çalışan bir web sitesine dağıtıyorsanız, geçişleri aynı anda çalıştırmaya çalışan birden çok sunucu alabilirsiniz. Geçişler atomiktir, bu nedenle iki sunucu aynı geçişi çalıştırmayı denerse biri başarılı olur, diğeri başarısız olur (işlemlerin iki kez yapılamadığını varsayarsak). Bu senaryoda, bu sorunlardan kaçınmak istiyorsanız geçişleri el ile çağırabilir ve yalnızca bir kez gerçekleşmesi için kendi kodunuzu ayarlayabilirsiniz. Daha fazla bilgi için Rowan Miller'ın blogundaki Koddan Geçişleri Çalıştırma ve Betik Oluşturma bölümüne bakın ve Migrate.exe (komut satırından geçişleri yürütmek için).

Diğer geçiş senaryoları hakkında bilgi için bkz . Migrations Screencast Series.

Belirli geçişi güncelleştirme

update-database -target MigrationName

Komut, update-database -target MigrationName hedeflenen geçişi çalıştırır.

Veritabanına geçiş değişikliklerini yoksayma

Add-migration MigrationName -ignoreChanges

ignoreChanges anlık görüntü olarak geçerli modelle boş bir geçiş oluşturur.

Code First başlatıcıları

Dağıtım bölümünde MigrateDatabaseToLatestVersion başlatıcısının kullanıldığını gördünüz. Code First ayrıca CreateDatabaseIfNotExists (varsayılan), DropCreateDatabaseIfModelChanges (daha önce kullandığınız) ve DropCreateDatabaseAlways gibi diğer başlatıcıları da sağlar. Başlatıcı, DropCreateAlways birim testleri için koşulları ayarlamak için yararlı olabilir. Ayrıca kendi başlatıcılarınızı da yazabilir ve uygulamanın veritabanından okumasını veya veritabanına yazmasını beklemek istemiyorsanız bir başlatıcıyı açıkça çağırabilirsiniz.

Başlatıcılar hakkında daha fazla bilgi için bkz. Entity Framework Code First'de Veritabanı Başlatıcılarını Anlama ve Programlama Entity Framework: Code First by Julie Lerman ve Rowan Miller kitabının 6. bölümü.

Kodu alma

Tamamlanan Projeyi İndirme

Ek kaynaklar

Diğer Entity Framework kaynaklarına bağlantılar ASP.NET Veri Erişimi - Önerilen Kaynaklar bölümünde bulunabilir.

Sonraki adımlar

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

  • Code First geçişleri etkinleştirildi
  • Uygulamayı Azure'da dağıtıldı (isteğe bağlı)

bir ASP.NET MVC Uygulaması için daha karmaşık bir veri modeli oluşturmayı öğrenmek için sonraki makaleye ilerleyin.