Entity Framework uygulamasında yeniyim ve varlıkları veritabanından yüklemek için Kod İlkesinin nasıl kullanıldığını öğrenmeye çalışıyorum.Entity Framework Code İlkesindeki ilgili varlıkların döngüsel yüklenmesini nasıl önlerim?
public class AuditEntry
{
public int AuditEntryID { get; set; }
[Required]
public string Message { get; set; }
// Navigation Properties
public int UserID { get; set; }
public virtual User User { get; set; }
}
Bir DBContext var sadece iki açığa:
public class User
{
public int UserID { get; set; }
[Required]
public string Name { get; set; }
// Navigation Properties
public virtual ICollection<AuditEntry> AuditEntries { get; set; }
}
Her kullanıcı basit bir mesaj içeren her hangi denetim girdileri kümesi olabilir:
Benim modelim bir kullanıcı içeriyor tablolar:
public DbSet<User> Users { get; set; }
public DbSet<AuditEntry> AuditEntries { get; set; }
ne yapmak istiyorum karmaşa içeren AuditEntry nesnelerin listesini yüklemek olduğunu Kullanıcı Kimliği ve Ad özelliklerini içeren yaş ve ilgili Kullanıcı nesnesi.
List<AuditEntry> auditEntries = db.AuditEntries.ToList();
benim navigasyon özellikleri sanal olarak işaretlenir ve ben sonsuz derin nesne grafiği elde, tembel yükleme devre dışı değil Çünkü (her AuditEntry, her AuditEntries listesini içeren bir User nesnesi vardır Bu, AuditEntries'in bir listesini içeren bir Kullanıcı nesnesini içerir.)
Nesneyi serileştirmek istiyorsam (örneğin bir Web API'sinde sonuç olarak göndermek için), bu iyi bir şey değildir.
Tembel yükleme özelliğini kapatmayı denedim (modeldeki gezinme özelliklerinden gelen sanal anahtar sözcükleri kaldırarak veya bunu ekleyerek bunu .Configuration.LazyLoadingEnabled = false; DBContext'ime). Beklendiği gibi, bu kullanıcı null olarak ayarlanmış bir AuditEntry nesnelerinin düz bir listesiyle sonuçlanır.
var auditentries = db.AuditEntries.Include(a => a.User);
ama bu öncekiyle aynı derin/döngüsel sonucu ortaya çıkarır: tembel yükleme kapalıyken
, ben Kullanıcı şöyle istekli yüke denedim.
Ayrıca geri referansları/navigasyon özelliklerini takip ederek orijinal nesneyi geri yüklemek ve bir döngü oluşturmaksızın bir seviye derinliği nasıl yükleyebilirim (örn. Kullanıcı kimliğini ve adını ekleyin)? (Dahili) Bu üretir
public dynamic GetAuditEntries()
{
var result = from a in db.AuditEntries
select new
{
a.AuditEntryID,
a.Message,
User = new
{
a.User.UserID,
a.User.Username
}
};
return result;
}
mantıklı görünüyor aşağıdaki SQL:
'Include' sadece bunu yapmalıdır. User.AuditEntries'in tembel yükleme olmadığından emin misiniz? –
Nesne düzenlendikten sonra nesneyi serileştirirseniz ne olur? –
İlk başta ancak bunun tembel yükleme olduğunu düşünmüyorum - tüm navigasyon özelliklerimden sanal anahtar kelimeyi kaldırıyorum ve tembel yükleme işlemini açık bir şekilde devre dışı bırakmak yardımcı olmaz. Sanırım her iki yöne giden gezinme özelliklerine sahip olduğumu düşünüyorum, ör. Kullanıcının AuditEntries listesi vardır ve AuditEntries, ait olduğu Kullanıcıyı tanımlar. AuditEntries'i sorgulamak ve Kullanıcı bilgilerini eklemek istiyorum, ancak her üst düzey AuditEntry nesnesinin, o Kullanıcı için diğer tüm AuditEntries'in bir listesini içermesini istemiyorum. Neler olduğunu açıklamakta zorlandığım için çok zor! –