2012-08-13 20 views
5

Her bir özelliğe karşılık gelen veritabanındaki sütunun adını eklemek için bir POCO T4 şablonunu değiştirmeye çalışıyorum. Eski nedenlerden dolayı, veritabanı tablolarımız 8.3 ve sütunlarımız maksimum 10 karakterdir, bu yüzden işler kötüye gitmeye eğilimlidir. Verilen bir mülkün hangi sütuna karşılık geldiğine hızlı bir şekilde bakabilmek büyük bir yardım olacaktır.Entity Framework ve veritabanı sütun adları

Bunu yaptığınızda, bunun nasıl yapılacağına dair hiçbir fikrim yok. T4 şablonunu düzenleme fikrinden memnunum, sadece bir EdmProperty nesnesinden sütun adını nasıl geri alacağımı bilmiyorum.

Beni doğru yöne yönlendiren var mı?

+0

EdmProperty.Name'i kastettiğimi farz edelim. Temel sütun adını istiyorsun. – Maarten

+0

@Maarten - Doğru. – Bobson

cevap

1

Bu konuyu başka bir cevabımda zaten tartıştım ama bunu bulamıyorum. Sorun şu ki, bu bilgileri eşleştirmenin MSL bölümüne göz atmanız için gereken bilgileri elde etmelisiniz - sütunların özelliklerle eşleştirildiği bölüm. Ne yazık ki, MSL meta veri öğeleri için tüm API dahilidir (gelecekteki EF sürümü için bir hedefin onu kamuya açmak olduğunu düşünüyorum). Sınıf oluşturma için T4 şablonunuz olduğunda, normalde CSDL ile çalışırsınız - bu, varlık tanımıdır ve yalnızca EDMX şemasında gördüğünüz bilgileri ve varlıklar için özellik penceresini içerir.

+0

MetadataWorkspace'de mevcut değil mi? Diğer bazı cevaplar bunun T4'te nasıl elde edileceğini anlayamadığım halde olduğunu gösterdi. – Bobson

+0

MetadataWorkspace'de kullanılabilir, ancak çalışma alanındaki sorgular temel öğeleri döndürür ve aradığınız verilere erişmek için bunları yayınlamanız gerekir. MSL ile ilgili sorun, bu türlerin kamuya açık olmadığından onu kullanamazsınız - bu verileri elde etmek için yansıma kullanmalısınız. –

+0

T4 değerlendirildiğinde yansıma elde edildiğini varsayarak, yansıma kullanılan bir cevaptan memnun olurum. – Bobson

0

Bu sorunun çözümü için en iyi yolun bu olduğunu söylemeyeceğim, ama böyle yaptım. BoundField asp denetimlerine bağlanması için düz metin içinde sütun adlarını alabilmem gerekiyordu ve bu EF şablonunda pişirilmemişti.

Bu yüzden, "basit özellikler" i yükleyen bu kodu ekledim, yani: sütun isimleri, bunu yapmama izin vermek için. "ColumnNames" adlı "tablo" nesnesine bir yapı ekler ve sütun adlarını const dizeleri olarak gösterir.

<# 
    if (simpleProperties.Any()) 
    { 
#> 
    public struct ColumnName 
    { 
    <# 
     foreach (var simpleProperty in simpleProperties) 
     { 
    #> 
     public const string <#= simpleProperty #> = "<#= simpleProperty #>"; 
    <# 
     } 
    #> 
    } 
<# } 
#> 
} 

ben çözümde edmx dosyası altında bireysel dosyaları oluşturur T4 şablonunda bu kod bit önce bu yerleştirilir:

: şuna benzer bir kod yaratacaktır

<# 
    EndNamespace(code); 
} 
public partial class JobPosting 
{ 
    public int PositionRowId { get; set; } 
    public System.Guid PositionRelatedGuid { get; set; } 

    public struct ColumnName 
    { 
     public const string PositionRowId = "PositionRowId"; 
     public const string PositionRelatedGuid = "PositionRelatedGuid"; 
    } 
} 

Umarım bu yardımcı olur.

+0

Bu kodu benim önümde yok, ancak '' SimpleProperties' '' edmx' dosyasına dayalı isimleri vermiyor mu? Sütun veritabanında 'myColumnID' olarak adlandırılırsa, ancak tasarımcıda bu ismi C# tutarlılığı için MyColumnId olarak yeniden adlandırdım. – Bobson

+0

Bildiğim kadarıyla, ve dün EF öğrenmiştim, bu yüzden yanılmış olabilirim, edmx dosyasına dayanıyor, eğer tasarımcıda yeniden isimlendirirseniz, o zaman edmx adıyla ve veritabanı adıyla görünmez. sonuç. –

+1

Ben de öyle düşündüm. Bu kesinlikle iyi bir çözüm, ama sonra farklı bir sorun yaşadım. Sorum, özellikle, adını değiştirdikten sonra temel veritabanı adını nasıl alacağımız hakkındaydı. Neredeyse mümkün olmadığına ikna oldum, ancak bu soruyu bulan başkalarına yardım etmek için bu cevabı burada bırakmanızı tavsiye ediyorum. – Bobson