Entity Framework Code First'ün sütun eşlemelerini çalışma zamanında görüntülemenin bir yolu var mı?

Önce Entity Framework Koduna bir eklenti yazmaya çalışıyorum ve model sütunların yapılandırmasını çalışma zamanında elde etmek için bir yola ihtiyacım var. Örneğin, DbModelBuilder tarafından OnModelCreating 'daki kod ayarı şudur:

builder.Entity()
    .Property(n => n.ReportsToID).HasColumnName("ReportsTo");

Bu yapıldığında, EntityFramework mülkümün adının tablodaki sütun adından farklı olduğunu biliyor, ancak "ReportsTo" dizesinin kendimin ReportsToID ile ilişkili olduğunu nasıl bulabilirim işlem esnasında? İdeal olarak, aşağıdaki gibi bir yöntem yazmaya çalışıyorum:

public string GetMappedColumnName(DbContext context, 
    Func selector);

Hangi gibi olurdu:

string mappedColumnName = GetMappedColumnName(context, 
    x => x.ReportsToID);

DbContext içinde eşlenen sütun adlarını nerede bulacağımı bilmiyorum. Hatta erişilebilir mi?

5
Burada bir çözüm var (biraz): stackoverflow.com/a/20807366/861716 .
katma yazar Gert Arnold, kaynak
Gerçek çözümünüzü görmek isterim. Başka bir cevap olarak gönderebilir misiniz? Bana çok yardımcı olurdu.
katma yazar STW, kaynak
benzer bir problemim vardı. işte benim çözümüm: stackoverflow.com/questions/7008212/…
katma yazar maxlego, kaynak

1 cevap

Teorik olarak evet. Pratik olarak emin değilim çünkü basit bir testle çalışma zamanında bu bilgiyi alamadım - onları hata ayıklayıcıda görüyorum ama kullanamıyorum, çünkü kullanmam gereken tür varlık yönetiminde dahili.

Teori. Tüm haritalama bilgileri çalışma zamanında kullanılabilir ancak yansıma yoluyla kullanılamaz. Bunlar, doğrudan kullanım için kesinlikle tasarlanmamış olan MetadataWorkspace sınıfındaki örnekte saklanır, çünkü bu sınıfla yapılan her etkileşim, ihtiyacınız olan verileri nasıl alacağınızı bulmadan önce debugger'da biraz zaman geçirmenizi gerektirir. Bu verilere DbContext API'sı aracılığıyla erişilemez. DbContext 'i ObjectContext ' e geri dönüştürmelisiniz ve MetadataWorkspace 'e erişmelisiniz.

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
GlobalItem storageMapping = objContext.MetadataWorkspace.GetItem("NameOfYourContextClass", DataSpace.CSSpace);

Şimdi storageMapping , internal olan System.Data.Mapping.StorageEntityContainerMapping sınıfının bir örneğidir. Anladığım kadarıyla bu sınıf MSL'nin çalışma zamanı temsili olmalıdır = depolama ve kavramsal model arasında eşleştirme.

Eğer hata ayıklayıcı kullanıyorsanız örneği inceleyebilir ve özellikler ile sütunlar arasında eşleme hakkında bilgi bulabilirsiniz (oldukça derin iç içe geçmiş), böylece bunları elde etmek için yansıması da kullanabilirsiniz, ancak bu sizin sahip olmadığınız sınıfların ortak olmayan arayüzüne yansır. bu yüzden herhangi bir .NET framework düzeltme eki/düzeltme/güncelleme uygulamanızı bozabilir.

4
katma
@Sebastian: Bunlar ADO.NET ekibi için bir soru. Neden bu kadar karmaşık olduğunu cevaplayamıyorum ama bu, MS API'lerin genellikle nasıl çalıştığıdır - dahili olarak karmaşıktır ve başlangıçta MS tarafından öngörülemeyen herhangi bir uzantıya kapalıdır.
katma yazar Ladislav Mrnka, kaynak
Bir kez GlobalItem giriş noktasına sahip oldum, gerisi kolaydı! Teşekkürler.
katma yazar GenericTypeTea, kaynak
Bu bilgiyi almak neden bu kadar karmaşık? Toplu kesici uçların performansına gelince, EF gerçekten kötüdür. İşi yapmak için özel EntityDataReader ve SqlBulkCopy yazılımını kullanabilirsiniz, ancak yalnızca bu eşleştirmeler varsa. Bu eşlemelerden biri değiştiğinde manuel olarak düzeltme yapmak zorunda kalmadan bu eşlemeleri tekrar tekrar kodlamak istemiyorum. Biliyorum, OR/M toplu veriyle ilgili değil. Ancak toplu ekler yapmanız gereken diğer sistemlerden yapılan ithalatı göz önünde bulundurun. Şimdi ne var?
katma yazar Sebastian Weber, kaynak
Sütun adlarına erişme yolunu vermeniz mümkün mü? tek gördüğüm, nesnenin özellik adları, sütun adları değil
katma yazar Cedric Dumont, kaynak
katma yazar Cedric Dumont, kaynak