Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önceki öğreticilerde zaman uyumlu programlama modelini kullanarak verileri okumayı ve güncelleştirmeyi öğrendiniz. Bu öğreticide zaman uyumsuz programlama modelini nasıl uygulayabileceğinizi göreceksiniz. Zaman uyumsuz kod, sunucu kaynaklarını daha iyi kullandığından uygulamanın daha iyi performans göstermesine yardımcı olabilir.
Bu öğreticide, bir varlıkta ekleme, güncelleştirme ve silme işlemleri için saklı yordamların nasıl kullanılacağını da görürsünüz.
Son olarak, uygulamayı Azure'a yeniden dağıtın ve ilk dağıtımdan bu yana uyguladığınız tüm veritabanı değişiklikleriyle birlikte.
Aşağıdaki çizimlerde, çalışacağınız bazı sayfalar gösterilmektedir.


Bu öğreticide şunları yaptınız:
- Zaman uyumsuz kod hakkında bilgi edinin
- Bölüm denetleyicisi oluşturma
- Saklı yordamları kullanma
- Azure’a dağıtın
Önkoşullar
Neden zaman uyumsuz kod kullanmalısınız?
Bir web sunucusunun kullanılabilir iş parçacığı sayısı sınırlıdır ve yüksek yük durumlarında tüm kullanılabilir iş parçacıkları kullanımda olabilir. Bu durumda, iş parçacıkları boşaltılana kadar sunucu yeni istekleri işleyemez. Zaman uyumlu kodla, G/Ç'nin tamamlanmasını beklediği için aslında herhangi bir iş yapmadıkları sırada birçok iş parçacığı bağlanabilir. Zaman uyumsuz kodla, bir işlem G/Ç'nin tamamlanmasını beklediğinde, iş parçacığı sunucunun diğer istekleri işlemek için kullanması için serbest kalır. Sonuç olarak, zaman uyumsuz kod sunucu kaynaklarının daha verimli bir şekilde kullanılmasını sağlar ve sunucu gecikme olmadan daha fazla trafiği işlemek için etkinleştirilir.
.NET'in önceki sürümlerinde zaman uyumsuz kod yazma ve test etme karmaşıktı, hataya açıktı ve hata ayıklaması zordu. .NET 4.5'te, zaman uyumsuz kod yazma, test etme ve hata ayıklama o kadar kolaydır ki, yazmamak için bir nedeniniz yoksa genellikle zaman uyumsuz kod yazmanız gerekir. Zaman uyumsuz kod küçük miktarda ek yük getirir, ancak düşük trafik durumlarında performans isabeti göz ardı edilebilirken, yüksek trafik durumlarında olası performans artışı önemli ölçüde olur.
Zaman uyumsuz programlama hakkında daha fazla bilgi için, çağrıların engellenmesini önlemek için .NET 4.5'in zaman uyumsuz desteğini kullanma bölümüne bakın.
Bölüm denetleyicisi oluşturma
Önceki denetleyicilerle aynı şekilde bir Departman denetleyicisi oluşturun, ancak bu kez Zaman uyumsuz denetleyici eylemlerini kullan onay kutusunu seçin.
Aşağıdaki vurgular, yöntemin zaman uyumsuz hale getirmesi için Index zaman uyumlu koda ne eklendiğini gösterir:
public async Task<ActionResult> Index()
{
var departments = db.Departments.Include(d => d.Administrator);
return View(await departments.ToListAsync());
}
Entity Framework veritabanı sorgusunun zaman uyumsuz olarak yürütülmesini sağlamak için dört değişiklik uygulandı:
- yöntemi, derleyiciye yöntem gövdesinin
asyncbölümleri için geri çağırmalar oluşturmasını ve döndürülen nesneyi otomatik olarak oluşturmasınıTask<ActionResult>söyleyen anahtar sözcüğüyle işaretlenir. - Dönüş türü olarak
ActionResultTask<ActionResult>değiştirildi. türü,Task<T>türündekiTbir sonuçla devam eden çalışmayı temsil eder. - Anahtar
awaitsözcüğü web hizmeti çağrısına uygulandı. Derleyici bu anahtar sözcüğü gördüğünde, arka planda yöntemini iki bölüme böler. İlk bölüm, zaman uyumsuz olarak başlatılan işlemle sona erer. İkinci bölüm, işlem tamamlandığında çağrılan bir geri çağırma yöntemine konur. - Uzantı yönteminin zaman uyumsuz sürümü
ToListçağrıldı.
Deyimi neden departments.ToList değiştirildi, ancak deyimi değiştirilmiyor departments = db.Departments ? Bunun nedeni, yalnızca veritabanına sorgu veya komut gönderilmesine neden olan deyimlerin zaman uyumsuz olarak yürütülmesidir. deyimi departments = db.Departments bir sorgu ayarlar, ancak yöntem çağrılana ToList kadar sorgu yürütülür. Bu nedenle, yalnızca ToList yöntemi zaman uyumsuz olarak yürütülür.
yönteminde Details ve Delete HttpGet Edit yöntemlerinde Find yöntemi, veritabanına sorgu gönderilmesine neden olan yöntemdir, bu nedenle zaman uyumsuz olarak yürütülen yöntemdir:
public async Task<ActionResult> Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Department department = await db.Departments.FindAsync(id);
if (department == null)
{
return HttpNotFound();
}
return View(department);
}
Create, HttpPost Editve DeleteConfirmed yöntemlerinde, yalnızca bellekteki varlıkların SaveChanges değiştirilmesine neden olan deyimler db.Departments.Add(department) değil, bir komutun yürütülmesine neden olan yöntem çağrısıdır.
public async Task<ActionResult> Create(Department department)
{
if (ModelState.IsValid)
{
db.Departments.Add(department);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
Views\Department\Index.cshtml dosyasını açın ve şablon kodunu aşağıdaki kodla değiştirin:
@model IEnumerable<ContosoUniversity.Models.Department>
@{
ViewBag.Title = "Departments";
}
<h2>Departments</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Budget)
</th>
<th>
@Html.DisplayNameFor(model => model.StartDate)
</th>
<th>
Administrator
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Budget)
</td>
<td>
@Html.DisplayFor(modelItem => item.StartDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Administrator.FullName)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.DepartmentID }) |
@Html.ActionLink("Details", "Details", new { id=item.DepartmentID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.DepartmentID })
</td>
</tr>
}
</table>
Bu kod başlığı Dizinden Departmanlara değiştirir, Yönetici adını sağa taşır ve yöneticinin tam adını sağlar.
Oluştur, Sil, Ayrıntılar ve Düzenle görünümlerinde, bölüm adı alanını Kurs görünümlerinde "Bölüm" olarak değiştirdiğiniz gibi alanın resim yazısını InstructorID da "Yönetici" olarak değiştirin.
Oluştur ve Düzenle görünümlerinde aşağıdaki kodu kullanın:
<label class="control-label col-md-2" for="InstructorID">Administrator</label>
Sil ve Ayrıntılar görünümlerinde aşağıdaki kodu kullanın:
<dt>
Administrator
</dt>
Uygulamayı çalıştırın ve Departmanlar sekmesine tıklayın.
Her şey diğer denetleyicilerle aynı şekilde çalışır, ancak bu denetleyicide tüm SQL sorguları zaman uyumsuz olarak yürütülür.
Entity Framework ile zaman uyumsuz programlama kullanırken dikkat etmeniz gereken bazı şeyler:
- Zaman uyumsuz kod iş parçacığı güvenli değil. Başka bir deyişle, aynı bağlam örneğini kullanarak birden çok işlemi paralel olarak yapmaya çalışmayın.
- Zaman uyumsuz kodun performans avantajlarından yararlanmak istiyorsanız, kullandığınız tüm kitaplık paketlerinin (disk belleği gibi) veritabanına sorgu gönderilmesine neden olan Entity Framework yöntemlerini çağırırsa da zaman uyumsuz kullandığından emin olun.
Saklı yordamları kullanma
Bazı geliştiriciler ve DTA'lar veritabanı erişimi için saklı yordamları kullanmayı tercih eder. Entity Framework'ün önceki sürümlerinde ham SQL sorgusu yürüterek saklı yordam kullanarak veri alabilirsiniz, ancak EF'ye güncelleştirme işlemleri için saklı yordamları kullanmasını bildiremezsiniz. EF 6'da, saklı yordamları kullanmak için Code First'i yapılandırmak kolaydır.
DAL\SchoolContext.cs'da, vurgulanan kodu yöntemine
OnModelCreatingekleyin.protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Entity<Course>() .HasMany(c => c.Instructors).WithMany(i => i.Courses) .Map(t => t.MapLeftKey("CourseID") .MapRightKey("InstructorID") .ToTable("CourseInstructor")); modelBuilder.Entity<Department>().MapToStoredProcedures(); }Bu kod, Entity Framework'e varlıktaki
Departmentekleme, güncelleştirme ve silme işlemleri için saklı yordamları kullanmasını sağlar.Paket Yönetimi Konsolu'nda aşağıdaki komutu girin:
add-migration DepartmentSPEkleme, Güncelleştirme ve Silme saklı yordamları oluşturan yöntemdeki
Upkodu görmek için Migrations\<timestamp>_DepartmentSP.cs dosyasını açın:public override void Up() { CreateStoredProcedure( "dbo.Department_Insert", p => new { Name = p.String(maxLength: 50), Budget = p.Decimal(precision: 19, scale: 4, storeType: "money"), StartDate = p.DateTime(), InstructorID = p.Int(), }, body: @"INSERT [dbo].[Department]([Name], [Budget], [StartDate], [InstructorID]) VALUES (@Name, @Budget, @StartDate, @InstructorID) DECLARE @DepartmentID int SELECT @DepartmentID = [DepartmentID] FROM [dbo].[Department] WHERE @@ROWCOUNT > 0 AND [DepartmentID] = scope_identity() SELECT t0.[DepartmentID] FROM [dbo].[Department] AS t0 WHERE @@ROWCOUNT > 0 AND t0.[DepartmentID] = @DepartmentID" ); CreateStoredProcedure( "dbo.Department_Update", p => new { DepartmentID = p.Int(), Name = p.String(maxLength: 50), Budget = p.Decimal(precision: 19, scale: 4, storeType: "money"), StartDate = p.DateTime(), InstructorID = p.Int(), }, body: @"UPDATE [dbo].[Department] SET [Name] = @Name, [Budget] = @Budget, [StartDate] = @StartDate, [InstructorID] = @InstructorID WHERE ([DepartmentID] = @DepartmentID)" ); CreateStoredProcedure( "dbo.Department_Delete", p => new { DepartmentID = p.Int(), }, body: @"DELETE [dbo].[Department] WHERE ([DepartmentID] = @DepartmentID)" ); }Paket Yönetimi Konsolu'nda aşağıdaki komutu girin:
update-databaseUygulamayı hata ayıklama modunda çalıştırın, Departmanlar sekmesine ve ardından Yeni Oluştur'a tıklayın.
Yeni bir departman için veri girin ve Oluştur'a tıklayın.
Visual Studio'da, yeni Departman satırını eklemek için saklı yordamın kullanıldığını görmek için Çıkış penceresindeki günlüklere bakın.

Code First varsayılan saklı yordam adlarını oluşturur. Mevcut bir veritabanını kullanıyorsanız, veritabanında önceden tanımlanmış saklı yordamları kullanmak için saklı yordam adlarını özelleştirmeniz gerekebilir. Bunun nasıl gerçekleştirileceği hakkında bilgi için bkz . Entity Framework Code First Insert/Update/Delete Stored Procedures.
Oluşturulan saklı yordamların ne yapacağını özelleştirmek istiyorsanız, saklı yordamı oluşturan geçişler Up yöntemi için iskelelenmiş kodu düzenleyebilirsiniz. Bu şekilde, geçiş her çalıştırıldığında değişiklikleriniz yansıtılır ve geçişler dağıtımdan sonra üretimde otomatik olarak çalıştırıldığında üretim veritabanınıza uygulanır.
Önceki bir geçişte oluşturulan mevcut saklı yordamı değiştirmek istiyorsanız, Add-Migration komutunu kullanarak boş bir geçiş oluşturabilir ve ardından AlterStoredProcedure yöntemini çağıran kodu el ile yazabilirsiniz.
Azure’a dağıtın
Bu bölüm, bu serinin Geçişler ve Dağıtım öğreticisindeki isteğe bağlı Uygulamayı Azure'a dağıtma bölümünü tamamlamış olmanız gerekir. Yerel projenizdeki veritabanını silerek çözdüğünüz geçiş hataları varsa bu bölümü atlayın.
Visual Studio'da, Çözüm Gezgini'da projeye sağ tıklayın ve bağlam menüsünden Yayımla'yı seçin.
Yayımla öğesine tıklayın.
Visual Studio uygulamayı Azure'a dağıtır ve uygulama varsayılan tarayıcınızda açılır ve Azure'da çalışır.
Çalıştığını doğrulamak için uygulamayı test edin.
Veritabanına erişen bir sayfayı ilk kez çalıştırdığınızda, Entity Framework veritabanını geçerli veri modeliyle güncel yapmak için gereken tüm geçiş
Upyöntemlerini çalıştırır. Artık bu öğreticide eklediğiniz Departman sayfaları da dahil olmak üzere, son dağıtımdan bu yana eklediğiniz tüm web sayfalarını kullanabilirsiniz.
Kodu alma
Ek kaynaklar
Diğer Entity Framework kaynaklarına bağlantılar ASP.NET Veri Erişimi - Önerilen Kaynaklar'da bulunabilir.
Sonraki adımlar
Bu öğreticide şunları yaptınız:
- Zaman uyumsuz kod hakkında bilgi edinildi
- Bölüm denetleyicisi oluşturuldu
- Kullanılan saklı yordamlar
- Azure'a dağıtıldı
Birden çok kullanıcı aynı varlığı aynı anda güncelleştirdiğinde çakışmaları işlemeyi öğrenmek için sonraki makaleye ilerleyin.