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.
tarafından Tom Dykstra
Contoso University örnek web uygulaması, Entity Framework 5 Code First ve Visual Studio 2012 kullanarak ASP.NET MVC 4 uygulamalarının nasıl oluşturulacağını gösterir. Öğretici serisi hakkında bilgi için serideki ilk öğreticiye bakın.
Not
Çözemediğiniz bir sorunla karşılaşırsanız tamamlanmış bölümü indirin ve sorununuzu yeniden oluşturmayı deneyin. Kodunuzu tamamlanmış kodla karşılaştırarak sorunun çözümünü genel olarak bulabilirsiniz. Bazı yaygın hatalar ve bunların nasıl çözüldüğü için bkz . Hatalar ve Geçici Çözümler.
Önceki öğreticide depoyu ve iş desenleri birimini uyguladınız. Bu öğretici aşağıdaki konuları kapsar:
- Ham SQL sorguları gerçekleştirme.
- İzleme olmayan sorgular gerçekleştirme.
- Veritabanına gönderilen sorguları inceleme.
- Ara sunucu sınıflarıyla çalışma.
- Değişikliklerin otomatik algılanması devre dışı bırakılmaktadır.
- Değişiklikleri kaydederken doğrulama devre dışı bırakıldığında.
- Hatalar ve Geçici Çözüm
Bu konuların çoğu için, önceden oluşturduğunuz sayfalarla çalışacaksınız. Toplu güncelleştirmeler yapmak için ham SQL kullanmak için veritabanındaki tüm derslerin kredi sayısını güncelleştiren yeni bir sayfa oluşturacaksınız:

İzleme yok sorgusunu kullanmak için Bölüm Düzenleme sayfasına yeni doğrulama mantığı ekleyeceksiniz:

Ham SQL Sorguları Gerçekleştirme
Entity Framework Code First API'sinde SQL komutlarını doğrudan veritabanına geçirmenizi sağlayan yöntemler bulunur. Aşağıdaki seçenekler mevcuttur:
DbSet.SqlQueryVarlık türleri döndüren sorgular için yöntemini kullanın. Döndürülen nesneler nesne tarafındanDbSetbeklenen türde olmalıdır ve izlemeyi kapatmadığınız sürece veritabanı bağlamı tarafından otomatik olarak izlenir. (Yöntemi hakkında aşağıdaki bölümeAsNoTrackingbakın.)Database.SqlQueryVarlık olmayan türler döndüren sorgular için yöntemini kullanın. Varlık türlerini almak için bu yöntemi kullansanız bile, döndürülen veriler veritabanı bağlamı tarafından izlenmez.- Sorgu olmayan komutlar için Database.ExecuteSqlCommand kullanın.
Entity Framework kullanmanın avantajlarından biri, kodunuzu belirli bir veri depolama yöntemine çok yakın bağlamaktan kaçınmasıdır. Bunu, sizin için SQL sorguları ve komutları oluşturarak yapar ve bu da bunları kendiniz yazmak zorunda kalmadan sizi serbesttir. Ancak el ile oluşturduğunuz belirli SQL sorgularını çalıştırmanız gerektiğinde istisnai senaryolar vardır ve bu yöntemler bu tür özel durumları işlemenizi mümkün kılar.
Bir web uygulamasında SQL komutlarını yürütürken her zaman olduğu gibi, sitenizi SQL ekleme saldırılarına karşı korumak için önlemler almanız gerekir. Bunun bir yolu, bir web sayfası tarafından gönderilen dizelerin SQL komutları olarak yorumlanamaz olduğundan emin olmak için parametreli sorgular kullanmaktır. Bu öğreticide, kullanıcı girişini sorguyla tümleştirirken parametreli sorgular kullanacaksınız.
Varlık Döndüren Bir Sorguyu Çağırma
Sınıfın GenericRepository ek yöntemlerle türetilmiş bir sınıf oluşturmanıza gerek kalmadan ek filtreleme ve sıralama esnekliği sağlamasını istediğinizi varsayalım. Bunu başarma yollarından biri, SQL sorgusunu kabul eden bir yöntem eklemektir. Ardından, bir birleşimlere veya alt sorguya bağlı bir Where yan tümce gibi, denetleyicide istediğiniz herhangi bir filtreleme veya sıralama türünü belirtebilirsiniz. Bu bölümde, böyle bir yöntemin nasıl uygulandığını göreceksiniz.
GetWithRawSql GenericRepository.cs aşağıdaki kodu ekleyerek yöntemini oluşturun:
public virtual IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters)
{
return dbSet.SqlQuery(query, parameters).ToList();
}
CourseController.cs'da, aşağıdaki örnekte gösterildiği gibi yönteminden Details yeni yöntemi çağırın:
public ActionResult Details(int id)
{
var query = "SELECT * FROM Course WHERE CourseID = @p0";
return View(unitOfWork.CourseRepository.GetWithRawSql(query, id).Single());
}
Bu durumda yöntemini kullanmış GetByID olmanıza rağmen yöntemini kullanarak GetWithRawSql yönteminin GetWithRawSQL çalıştığını doğrulamış olursunuz.
Seçme sorgusunun çalıştığını doğrulamak için Ayrıntılar sayfasını çalıştırın (Bir kurs için Kurs sekmesini ve ardından Ayrıntılar'ı seçin).

Diğer Nesne Türlerini Döndüren Bir Sorguyu Çağırma
Daha önce, Hakkında sayfası için her kayıt tarihi için öğrenci sayısını gösteren bir öğrenci istatistikleri kılavuzu oluşturdunuz. HomeController.cs'da bunu sağlayan kod LINQ kullanır:
var data = from student in db.Students
group student by student.EnrollmentDate into dateGroup
select new EnrollmentDateGroup()
{
EnrollmentDate = dateGroup.Key,
StudentCount = dateGroup.Count()
};
LINQ kullanmak yerine bu verileri doğrudan SQL'de alan kodu yazmak istediğinizi varsayalım. Bunu yapmak için varlık nesneleri dışında bir şey döndüren bir sorgu çalıştırmanız gerekir; bu da yöntemini kullanmanız Database.SqlQuery gerektiği anlamına gelir.
HomeController.cs'de yöntemindeki LINQ deyimini About aşağıdaki kodla değiştirin:
var query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
+ "FROM Person "
+ "WHERE EnrollmentDate IS NOT NULL "
+ "GROUP BY EnrollmentDate";
var data = db.Database.SqlQuery<EnrollmentDateGroup>(query);
Hakkında sayfasını çalıştırın. Daha önce görüntülediği verileri görüntüler.

Güncelleştirme Sorgusu Çağırma
Contoso Üniversitesi yöneticilerinin veritabanında her kursun kredi sayısını değiştirme gibi toplu değişiklikler yapabilmek istediğini varsayalım. Üniversitenin çok sayıda dersi varsa, bunların tümünü varlık olarak almak ve tek tek değiştirmek verimsiz olacaktır. Bu bölümde, kullanıcının tüm kurslar için kredi sayısını değiştireceği bir faktör belirtmesine olanak tanıyan bir web sayfası uygulayacak ve bir SQL UPDATE deyimi yürüterek değişikliği yapacaksınız. Web sayfası aşağıdaki çizim gibi görünür:

Önceki öğreticide, denetleyicideki varlıkları okumak ve güncelleştirmek Course için genel depoyu Course kullandınız. Bu toplu güncelleştirme işlemi için genel depoda olmayan yeni bir depo yöntemi oluşturmanız gerekir. Bunu yapmak için sınıfından GenericRepository türetilen ayrılmış CourseRepository bir sınıf oluşturacaksınız.
DAL klasöründe CourseRepository.cs oluşturun ve var olan kodu aşağıdaki kodla değiştirin:
using System;
using ContosoUniversity.Models;
namespace ContosoUniversity.DAL
{
public class CourseRepository : GenericRepository<Course>
{
public CourseRepository(SchoolContext context)
: base(context)
{
}
public int UpdateCourseCredits(int multiplier)
{
return context.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier);
}
}
}
UnitOfWork.cs'da depo türünü GenericRepository<Course> olarak değiştirin CourseCourseRepository:
private CourseRepository courseRepository;
public CourseRepository CourseRepository
{
get
{
if (this.courseRepository == null)
{
this.courseRepository = new CourseRepository(context);
}
return courseRepository;
}
}
CourseController.cs bir UpdateCourseCredits yöntem ekleyin:
public ActionResult UpdateCourseCredits(int? multiplier)
{
if (multiplier != null)
{
ViewBag.RowsAffected = unitOfWork.CourseRepository.UpdateCourseCredits(multiplier.Value);
}
return View();
}
Bu yöntem hem hem de HttpGet HttpPostiçin kullanılır. HttpGet UpdateCourseCredits Yöntem çalıştırıldığında değişken multiplier null olur ve görünümde önceki çizimde gösterildiği gibi boş bir metin kutusu ve gönder düğmesi görüntülenir.
Güncelleştir düğmesine tıklandığında ve HttpPost yöntem çalıştığında, multiplier metin kutusuna değer girilir. Kod daha sonra etkilenen satırların sayısını döndüren depo UpdateCourseCredits yöntemini çağırır ve bu değer nesnede ViewBag depolanır. Görünüm nesnedeki etkilenen satır sayısını aldığında, aşağıdaki çizimde ViewBag gösterildiği gibi metin kutusu ve gönder düğmesi yerine bu sayıyı görüntüler:

Kurs Kredilerini Güncelleştir sayfasının Views\Course klasöründe bir görünüm oluşturun:

Views\Course\UpdateCourseCredits.cshtml dosyasında şablon kodunu aşağıdaki kodla değiştirin:
@model ContosoUniversity.Models.Course
@{
ViewBag.Title = "UpdateCourseCredits";
}
<h2>Update Course Credits</h2>
@if (ViewBag.RowsAffected == null)
{
using (Html.BeginForm())
{
<p>
Enter a number to multiply every course's credits by: @Html.TextBox("multiplier")
</p>
<p>
<input type="submit" value="Update" />
</p>
}
}
@if (ViewBag.RowsAffected != null)
{
<p>
Number of rows updated: @ViewBag.RowsAffected
</p>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Kurslar sekmesini seçip ardından tarayıcının UpdateCourseCredits adres çubuğunda url'nin sonuna "/UpdateCourseCredits" ekleyerek yöntemini çalıştırın (örneğin: http://localhost:50205/Course/UpdateCourseCredits). Metin kutusuna bir sayı girin:

Güncelleştir'i tıklatın. Etkilenen satır sayısını görürsünüz:

Düzeltilmiş kredi sayısına sahip kursların listesini görmek için Listeye Geri Dön'e tıklayın.

Ham SQL sorguları hakkında daha fazla bilgi için Entity Framework ekip blogundaki Ham SQL Sorguları'na bakın.
İzlemeSiz Sorgular
Veritabanı bağlamı veritabanı satırlarını aldığında ve bunları temsil eden varlık nesneleri oluşturduğunda, varsayılan olarak bellekteki varlıkların veritabanındakilerle eşitlenmiş olup olmadığını izler. Bellekteki veriler önbellek görevi görür ve varlığı güncelleştirdiğinizde kullanılır. Bağlam örnekleri genellikle kısa süreli (her istek için yeni bir tane oluşturulur ve atılır) ve bir varlığı okuyan bağlam genellikle bu varlık yeniden kullanılmadan önce atıldığından, bu önbelleğe alma genellikle bir web uygulamasında gereksizdir.
yöntemini kullanarak AsNoTracking bağlamın sorgu için varlık nesnelerinin izlenip izleneceğini belirtebilirsiniz. Bunu yapmak isteyebileceğiniz tipik senaryolar şunlardır:
- Sorgu, izlemeyi kapatmanın performansı önemli ölçüde artırabileceği kadar büyük miktarda veri alır.
- Güncelleştirmek için bir varlık eklemek istiyorsunuz, ancak daha önce aynı varlığı farklı bir amaç için aldıysanız. Varlık veritabanı bağlamı tarafından zaten izlendiğinden, değiştirmek istediğiniz varlığı ekleyemezsiniz. Bunun olmasını önlemenin bir yolu, önceki sorguda seçeneğini kullanmaktır
AsNoTracking.
Bu bölümde, bu senaryoların ikincisini gösteren iş mantığı uygulayacaksınız. Özel olarak, eğitmenin birden fazla departmanın yöneticisi olmadığını belirten bir iş kuralı uygulayacaksınız.
DepartmentController.cs'da, iki departmanın aynı yöneticiye sahip olmadığından emin olmak için ve Create yöntemlerinden Edit çağırabileceğiniz yeni bir yöntem ekleyin:
private void ValidateOneAdministratorAssignmentPerInstructor(Department department)
{
if (department.PersonID != null)
{
var duplicateDepartment = db.Departments
.Include("Administrator")
.Where(d => d.PersonID == department.PersonID)
.FirstOrDefault();
if (duplicateDepartment != null && duplicateDepartment.DepartmentID != department.DepartmentID)
{
var errorMessage = String.Format(
"Instructor {0} {1} is already administrator of the {2} department.",
duplicateDepartment.Administrator.FirstMidName,
duplicateDepartment.Administrator.LastName,
duplicateDepartment.Name);
ModelState.AddModelError(string.Empty, errorMessage);
}
}
}
Doğrulama hatası yoksa bu yeni yöntemi çağırmak için yönteminin HttpPost Edit bloğuna kod try ekleyin. Blok try artık aşağıdaki örneğe benzer:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(
[Bind(Include = "DepartmentID, Name, Budget, StartDate, RowVersion, PersonID")]
Department department)
{
try
{
if (ModelState.IsValid)
{
ValidateOneAdministratorAssignmentPerInstructor(department);
}
if (ModelState.IsValid)
{
db.Entry(department).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var clientValues = (Department)entry.Entity;
Bölüm Düzenleme sayfasını çalıştırın ve bir departmanın yöneticisini zaten farklı bir departmanın yöneticisi olan bir eğitmen olarak değiştirmeyi deneyin. Beklenen hata iletisini alırsınız:

Şimdi Departman Düzenleme sayfasını yeniden çalıştırın ve bu kez Bütçe tutarını değiştirin. Kaydet'e tıkladığınızda bir hata sayfası görürsünüz:

Özel durum hata iletisi şudur: "An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key." Bu, aşağıdaki olay dizisi nedeniyle oluştu:
Edityöntemi, Kim Abercrombie'ye sahip tüm departmanları yöneticisi olarak alan yöntemini çağırırValidateOneAdministratorAssignmentPerInstructor. Bu da İngilizce bölümünün okunmasının nedeni. Bu bölüm düzenlendiği için hata bildirilmemiştir. Ancak bu okuma işleminin bir sonucu olarak, veritabanından okunan İngilizce departman varlığı artık veritabanı bağlamı tarafından izleniyor.- yöntemi,
EditMVC model bağlayıcısı tarafından oluşturulan İngilizce departman varlığında bayrağı ayarlamayaModifiedçalışır, ancak bağlam zaten İngilizce bölümü için bir varlığı izlediğinden başarısız olur.
Bu sorunun bir çözümü, bağlamın doğrulama sorgusu tarafından alınan bellek içi departman varlıklarını izlemesini sağlamaktır. Bunu yapmanın hiçbir dezavantajı yoktur, çünkü bu varlığı güncelleştirmeyecek veya bellekte önbelleğe alınmasından yararlanacak şekilde yeniden okumayacaksınız.
DepartmentController.cs yöntemindeValidateOneAdministratorAssignmentPerInstructor, aşağıda gösterildiği gibi izleme belirtme:
var duplicateDepartment = db.Departments
.Include("Administrator")
.Where(d => d.PersonID == department.PersonID)
.AsNoTracking()
.FirstOrDefault();
Bir bölümün Bütçe miktarını düzenleme girişiminizi yineleyin. Bu kez işlem başarılı olur ve site, düzeltilmiş bütçe değerini gösteren Bölümler Dizini sayfasına beklendiği gibi döner.
Veritabanına Gönderilen Sorguları inceleme
Bazen veritabanına gönderilen gerçek SQL sorgularını görebilmek yararlı olabilir. Bunu yapmak için hata ayıklayıcıdaki bir sorgu değişkenini inceleyebilir veya sorgunun ToString yöntemini çağırabilirsiniz. Bunu denemek için basit bir sorguya göz atacak ve ardından hevesle yükleme, filtreleme ve sıralama gibi seçenekler eklerken bu sorguya ne olacağına bakacaksınız.
Controllers/CourseController'da yöntemini aşağıdaki kodla değiştirinIndex:
public ViewResult Index()
{
var courses = unitOfWork.CourseRepository.Get();
return View(courses.ToList());
}
Şimdi GenericRepository.cs ve return query.ToList(); yönteminin return orderBy(query).ToList(); deyimlerinde Get bir kesme noktası ayarlayın. Projeyi hata ayıklama modunda çalıştırın ve Kurs Dizini sayfasını seçin. Kod kesme noktasına ulaştığında değişkenini query inceleyin. SQL Server'a gönderilen sorguyu görürsünüz. Basit bir Select ifadedir:
{SELECT
[Extent1].[CourseID] AS [CourseID],
[Extent1].[Title] AS [Title],
[Extent1].[Credits] AS [Credits],
[Extent1].[DepartmentID] AS [DepartmentID]
FROM [Course] AS [Extent1]}

Sorgular Visual Studio'daki hata ayıklama pencerelerinde görüntülenemeyecek kadar uzun olabilir. Sorgunun tamamını görmek için değişken değerini kopyalayıp bir metin düzenleyicisine yapıştırabilirsiniz:

Şimdi, kullanıcıların belirli bir bölüm için filtre uygulayabilmesi için Kurs Dizini sayfasına bir açılan liste ekleyeceksiniz. Kursları başlığa göre sıralarsınız ve gezinti özelliği için hevesle Department yüklemeyi belirtirsiniz. CourseController.cs'da yöntemini aşağıdaki kodla değiştirinIndex:
public ActionResult Index(int? SelectedDepartment)
{
var departments = unitOfWork.DepartmentRepository.Get(
orderBy: q => q.OrderBy(d => d.Name));
ViewBag.SelectedDepartment = new SelectList(departments, "DepartmentID", "Name", SelectedDepartment);
int departmentID = SelectedDepartment.GetValueOrDefault();
return View(unitOfWork.CourseRepository.Get(
filter: d => !SelectedDepartment.HasValue || d.DepartmentID == departmentID,
orderBy: q => q.OrderBy(d => d.CourseID),
includeProperties: "Department"));
}
yöntemi, parametresindeki açılan listenin SelectedDepartment seçili değerini alır. Hiçbir şey seçilmezse, bu parametre null olur.
SelectList Tüm departmanları içeren bir koleksiyon, açılan listenin görünümüne geçirilir. Oluşturucuya SelectList geçirilen parametreler değer alanı adını, metin alanı adını ve seçili öğeyi belirtir.
Get Deponun yöntemi Course için kod, gezinti özelliği için Department bir filtre ifadesi, sıralama düzeni ve istekli yükleme belirtir. Açılan listede hiçbir şey seçilmezse (yani null olduğunda) SelectedDepartment filtre ifadesi her zaman döndürürtrue.
Views\Course\Index.cshtml'de, açılış table etiketinden hemen önce, açılan listeyi ve gönder düğmesini oluşturmak için aşağıdaki kodu ekleyin:
@using (Html.BeginForm())
{
<p>Select Department: @Html.DropDownList("SelectedDepartment","All")
<input type="submit" value="Filter" /></p>
}
Kesme noktaları hala sınıfında ayarlanmış GenericRepository durumdayken Kurs Dizini sayfasını çalıştırın. Sayfanın tarayıcıda görüntülenmesi için kodun kesme noktasına ilk iki kez isabet etmesiyle devam edin. Açılan listeden bir departman seçin ve Filtrele'ye tıklayın:

Bu kez ilk kesme noktası, açılan listenin departmanlar sorgusuna yönelik olacaktır. Bunu atlayın ve sorgunun query şimdi nasıl Course göründüğünü görmek için kod kesme noktasına bir sonraki eriştiğinde değişkeni görüntüleyin. Aşağıdakine benzer bir şey görürsünüz:
{SELECT
[Extent1].[CourseID] AS [CourseID],
[Extent1].[Title] AS [Title],
[Extent1].[Credits] AS [Credits],
[Extent1].[DepartmentID] AS [DepartmentID],
[Extent2].[DepartmentID] AS [DepartmentID1],
[Extent2].[Name] AS [Name],
[Extent2].[Budget] AS [Budget],
[Extent2].[StartDate] AS [StartDate],
[Extent2].[PersonID] AS [PersonID],
[Extent2].[Timestamp] AS [Timestamp]
FROM [Course] AS [Extent1]
INNER JOIN [Department] AS [Extent2] ON [Extent1].[DepartmentID] = [Extent2].[DepartmentID]
WHERE (@p__linq__0 IS NULL) OR ([Extent1].[DepartmentID] = @p__linq__1)}
Sorgunun artık verilerle Course birlikte veri yükleyen Department bir JOIN sorgu olduğunu ve bir WHERE yan tümcesi içerdiğini görebilirsiniz.
Proxy Sınıfları ile Çalışma
Entity Framework varlık örnekleri oluşturduğunda (örneğin, bir sorguyu yürütürken), bunları genellikle varlık için ara sunucu işlevi gören dinamik olarak oluşturulmuş türetilmiş bir türün örnekleri olarak oluşturur. Bu proxy, özelliğe erişildiğinde eylemleri otomatik olarak gerçekleştirmek için kanca eklemek üzere varlığın bazı sanal özelliklerini geçersiz kılar. Örneğin, bu mekanizma ilişkilerin yavaş yüklenmesini desteklemek için kullanılır.
Çoğu zaman proxy'lerin bu kullanımından haberdar olmanız gerekmez, ancak istisnalar vardır:
- Bazı senaryolarda Entity Framework'ün ara sunucu örnekleri oluşturmasını engellemek isteyebilirsiniz. Örneğin, ara sunucu olmayan örnekleri seri hale getirme, ara sunucu örneklerini seri hale getirmeden daha verimli olabilir.
- işlecini kullanarak bir varlık sınıfı örneği
newoluştururken ara sunucu örneği almazsınız. Bu, gecikmeli yükleme ve otomatik değişiklik izleme gibi işlevlere sahip olmadığınız anlamına gelir. Bu genellikle normaldir; veritabanında olmayan yeni bir varlık oluşturduğunuz ve varlığı açıkça olarakAddedolarak işaretliyorsanız genellikle değişiklik izlemesine gerek duymadığınız için genellikle gecikmeli yüklemeye ihtiyacınız yoktur. Ancak, gecikmeli yüklemeye ihtiyacınız varsa ve değişiklik izlemeye ihtiyacınız varsa, sınıfının yönteminiDbSetkullanarakCreateproxy'lerle yeni varlık örnekleri oluşturabilirsiniz. - Bir ara sunucu türünden gerçek bir varlık türü almak isteyebilirsiniz. Bir ara sunucu türü örneğinin gerçek varlık türünü almak için sınıfının yöntemini
ObjectContextkullanabilirsinizGetObjectType.
Daha fazla bilgi için Entity Framework ekip blogundaki Proxy'lerle çalışma bölümüne bakın.
Değişiklikleri Otomatik Algılamayı Devre Dışı Bırakma
Entity Framework, bir varlığın geçerli değerlerini özgün değerlerle karşılaştırarak varlığın nasıl değiştiğini (ve bu nedenle veritabanına hangi güncelleştirmelerin gönderilmesi gerektiğini) belirler. Özgün değerler, varlık sorgulandığında veya eklendiğinde depolanır. Otomatik değişiklik algılamaya neden olan yöntemlerden bazıları şunlardır:
DbSet.FindDbSet.LocalDbSet.RemoveDbSet.AddDbSet.AttachDbContext.SaveChangesDbContext.GetValidationErrorsDbContext.EntryDbChangeTracker.Entries
Çok sayıda varlığı izliyorsanız ve bu yöntemlerden birini döngüde birçok kez çağırıyorsanız AutoDetectChangesEnabled özelliğini kullanarak otomatik değişiklik algılamayı geçici olarak kapatarak önemli performans iyileştirmeleri alabilirsiniz. Daha fazla bilgi için bkz . Değişiklikleri Otomatik Olarak Algılama.
Değişiklikleri Kaydederken Doğrulamayı Devre Dışı Bırakma
yöntemini çağırdığınızda SaveChanges , Entity Framework varsayılan olarak veritabanını güncelleştirmeden önce değiştirilen tüm varlıkların tüm özelliklerindeki verileri doğrular. Çok sayıda varlığı güncelleştirdiyseniz ve verileri zaten doğruladıysanız, bu çalışma gereksizdir ve doğrulamayı geçici olarak kapatarak değişiklikleri kaydetme işleminin daha kısa sürmesini sağlayabilirsiniz. ValidateOnSaveEnabled özelliğini kullanarak bunu yapabilirsiniz. Daha fazla bilgi için bkz . Doğrulama.
Özet
Bu, ASP.NET MVC uygulamasında Entity Framework'ün kullanılmasıyla ilgili bu öğretici serisini tamamlar. Diğer Entity Framework kaynaklarına bağlantılar ASP.NET Veri Erişimi İçerik Eşlemesi'nde bulunabilir.
Web uygulamanızı derledikten sonra dağıtma hakkında daha fazla bilgi için bkz . MSDN Kitaplığı'nda Dağıtım İçerik Haritası ASP.NET.
Kimlik doğrulaması ve yetkilendirme gibi MVC ile ilgili diğer konular hakkında bilgi için bkz . MVC Önerilen Kaynaklar.
İlgili kaynaklar
- Tom Dykstra bu öğreticinin özgün sürümünü yazdı ve Microsoft Web Platformu ve Araçlar İçerik Ekibi'nin kıdemli programlama yazarıdır.
- Rick Anderson (twitter @RickAndMSFT) bu öğreticiyi birlikte yazdı ve çalışmaların çoğunu EF 5 ve MVC 4 için güncelleştirdi. Rick, Microsoft'un Azure ve MVC'ye odaklanan kıdemli bir programlama yazarıdır.
- Rowan Miller ve Entity Framework ekibinin diğer üyeleri, kod incelemelerine yardımcı oldu ve EF 5 öğreticisini güncelleştirirken ortaya geçen geçişlerle ilgili birçok sorunun hatalarını ayıklamaya yardımcı oldu.
VB
Öğretici ilk kez üretildiğinde tamamlanan indirme projesinin hem C# hem de VB sürümlerini sağladık. Bu güncelleştirmeyle, serinin herhangi bir yerinde çalışmaya başlamayı kolaylaştırmak amacıyla her bölüm için C# indirilebilir bir proje sağlıyoruz, ancak zaman sınırlamaları ve diğer önceliklerden dolayı VB için bunu yapmamış olduk. Bu öğreticileri kullanarak bir VB projesi oluşturuyorsanız ve bunu başkalarıyla paylaşmak istiyorsanız lütfen bize bildirin.
Hatalar ve Geçici Çözümler
Gölge kopya oluşturulamıyor/gölge kopya oluşturulamıyor
Hata İletisi:
Bu dosya zaten mevcut olduğunda 'DotNetOpenAuth.OpenId' gölge kopyası oluşturulamaz.
Çözüm:
Birkaç saniye bekleyin ve sayfayı yenileyin.
Update-Database tanınmıyor
Hata İletisi:
'Update-Database' terimi bir cmdlet, işlev, betik dosyası veya çalıştırılabilir programın adı olarak tanınmaz. Adın yazımını veya bir yol eklenip eklenmediğini denetleyin, yolun doğru olduğunu doğrulayın ve yeniden deneyin.(PMC'deki komuttan Update-Database .)
Çözüm:
Visual Studio'dan çıkın. Projeyi yeniden açın ve yeniden deneyin.
Doğrulama başarısız oldu
Hata İletisi:
Bir veya daha fazla varlık için doğrulama başarısız oldu. Daha fazla ayrıntı için bkz. 'EntityValidationErrors' özelliği. (PMC'deki komuttan Update-Database .)
Çözüm:
Bu sorunun nedenlerinden biri, yöntem çalıştırıldığında karşılaşılan Seed doğrulama hatalarıdır. Yöntemin hatalarını ayıklama hakkında ipuçları için bkz . Varlık Çerçevesi (EF) DB'lerini Ayıklama Seed ve Ayıklama.
HTTP 500.19 hatası
Hata İletisi:
HTTP Hatası 500.19 - İç Sunucu Hatası
Sayfayla ilgili yapılandırma verileri geçersiz olduğundan istenen sayfaya erişilemiyor.
Çözüm:
Bu hatayı alma yollarından biri, çözümün her biri aynı bağlantı noktası numarasını kullanan birden çok kopyasına sahip olmaktır. Bu sorunu genellikle Visual Studio'nun tüm örneklerinden çıkıp üzerinde çalıştığınız projeyi yeniden başlatarak çözebilirsiniz. Bu işe yaramazsa bağlantı noktası numarasını değiştirmeyi deneyin. Proje dosyasına sağ tıklayın ve ardından özellikler'e tıklayın. Web sekmesini seçin ve ardından Proje Url'si metin kutusundaki bağlantı noktası numarasını değiştirin.
SQL Server örneğini bulma hatası
Hata İletisi:
SQL Server ile bağlantı kurulmaya çalışılırken ağ ile ilişkili veya örneğe özgü bir hata oluştu. Sunucu bulunamadı veya erişilebilir değildi. Örnek adının doğru olduğundan ve SQL Server'ın uzak bağlantılara izin verecek şekilde yapılandırıldığından emin olun. (sağlayıcı: SQL Ağ Arabirimleri, hata: 26 - Belirtilen Sunucuyu/Örneği Bulma Hatası)
Çözüm:
bağlantı dizesi kontrol edin. Veritabanını el ile sildiyseniz, yapı dizesindeki veritabanının adını değiştirin.