2011-04-10 14 views
18

Entity Framework 4 kullanıyorum. Veritabanından ilk modeli oluşturduğum anlamına gelir, bu da veritabanından EDM oluşturduğum anlamına gelir. Şimdi model tanımlı bazı fonksiyonlar eklemek istiyorum. Sorum şu ... nerede?Varlık Çerçevesi: CSDL/MSL'yi nerede uzatırım?

Onları .edmx dosyasına koyarsam, veritabanımı güncellediğimde ve yeni EDM'yi oluşturduğumda tüm eklemelerim kopyalanmaz mı? Demek istediğim .Designer.cs dosyasının en üstünde, "Kod yenilenirse, bu dosyadaki el ile değişikliklerin üzerine yazılır."

Peki, hangi dosyada eklemeleri yaparım?

cevap

33

Birazcık derinden alacağım çünkü model tanımlı fonksiyonlar çok iyi bilinmemektedir.

Model tanımlı işlevler, EDMX dosyasının CSDL bölümüne manuel olarak eklenmelidir. Dosyayı XML olarak açmalı ve bir işlev eklemelisiniz.

<Function Name="FullName" ReturnType="Edm.String"> 
    <Parameter Name="emp" Type="TestModel.Employee" /> 
    <DefiningExpression> 
    Trim(emp.FirstName) + " " + Trim(emp.LastName) 
    </DefiningExpression> 
</Function> 

Artık EDMX kaydetmek ve tasarımcı dönebilirsiniz: Örneğin bu model tanımlı fonksiyon çalışanın tam adı üretebilmektedir. İşlev hala mevcut olacak ancak Model tarayıcısında görünmeyecektir. Modelinizi veritabanından güncelleyebilir veya tüm varlıklarınızı silebilirsiniz, ancak işlev hala tanımlanacaktır. EF, EDMX'in CSDL bölümünde özel modifikasyonu kaldırmaz.

Şimdi, bu model tanımlı işlevi kullanabilmek için .NET işlevini tanımlamanız gerekir. Her yerde yapabilirsin. Tek yönlü bağlamına kısmi sınıfını kullanmak ama aynı zamanda size sadece bazı cutom sınıfını kullanabilirsiniz geçerli:

public static class EdmFunctions 
{ 
    [EdmFunction("TestModel", "FullName")] 
    public static string FullName(Employee e) 
    { 
     throw new NotSupportedException("This function is only for L2E query."); 
    } 
} 

Ve yapılır. Tek kalan görev Linq varlıklar sorgusunda işlevini kullanmaktır:

using (var context = new TestEntities()) 
{ 
    var query = from e in context.Employees 
       select new 
        { 
         e.Id, 
         FullName = EdmFunctions.FullName(e) 
        }; 
    var data = query.ToList(); 
    ... 
} 

Modeli tanımlanmış fonksiyonlar sadece onlar sadece Linq varlıklar sorgularda kullanılabilmesi için SQL çevrilmiştir bazı yeniden Varlık SQL vardır . Model tanımlı fonksiyonlar çok daha karmaşık olabilir.

+2

Büyük yanıt - modelin tanımlı işlevlerini bilmeniz iyi bir model – BrokenGlass

+2

güncelleştirildiğinde, bu bir de aşağıdaki gibi bir MSDN makalesi vardır: [Nasıl Yapılır: Kavramsal Modelde Özel İşlevleri Tanımla (Varlık Framework)] (http://msdn.microsoft.com/en-us/library/dd456812.aspx) –

+0

Joel Mueller'in başka bir soruya verdiğiniz cevap, bahsettiğiniz şeye benziyor - bu çok titiz ve bunun nasıl yapıldığını gösteriyor çalışmak LINQ Nesneler de: [LINQ yöntemi 'çift Ayrıştırma (System.string)' yöntemi ve bu yöntemi tanımadığı varlıkları için bir depo ifade tercüme edilemez] [1] [ 1]: http://stackoverflow.com/a/5971677/35133 –