2010-01-14 28 views
8

Farklı bir veri modeli polimorfik yapmak için bir yolu olsaydı çok daha kolay olurdu yeni bir proje üzerinde çalışmaya başlıyorum. Entity Framework 4.0'ı (piyasaya sürüldüğünde) kullanmayı düşünüyorum, ancak gerçekten çalışıp çalışamayacağını belirleyemedim.Bir .NET Polimorfik Veri Çerçevesi var mı

İşte temel senaryo. Bir yorum sistemi uygularım ve bunu birçok farklı modele bağlayabilmek istiyorum. Belki bir kullanıcının profiline yorum ve bir web sayfasındaki yorumları istiyorum. Geçmişte bunu yapmamın yolu, kişi tablosu ile yorum tablosu arasındaki ilişkiyi, web sayfası tablosu ile yorum tablosu arasındaki ilişkiden ayrı olarak oluşturmaktır. Bununla birlikte, bunun veri tabanında aşırı karmaşık bir tablo yapısına yol açtığını düşünüyorum.

Yalnızca yorum yapmak istediğim nesnelere bir arabirim ekleyebilseydim ve sonra veritabanındaki tablo yapısını tek bir ilişkiye basitleştirebilirsem en iyi olurdu.

Karşılaştığım sorun, bu tür bir şeyin nasıl yapılacağı hakkında bilgi edinmek için doğru terminolojiyi bilmiyorum. Herkesin sağlayabileceği herhangi bir yardım büyük takdir edilecektir.

cevap

2

Yorum yapmadan-tip-agnostik (sadece temelleri, bir kimlik, tarih & zaman ve metin içerik gibi) olmak üzere "yorum tablosunu" tasarım varsa, o zaman can hepsini eşleyen tek bir ek tablo kullanın.

public interface ICommentable 
{ 
    int CommentTypeCode 
    int Id 
    ... 
} 

Şimdi bu mapper tablo sütunları içerir: "

  • bir kimliği ile,

    bir tabloda gitmek tüm Açıklamalarınız

  • comment_id target_object_id
    • comment_type_code Kişisel çeşitli hedef nesneler "hepsi aynı türde bir kimliği olmalıdır

      Artık, yorum tablosunu veya mapper tablosunu değiştirmeden sisteminize yeni "övgüye değer" nesneler ekleyebilirsiniz - yeni bir kod yazın ve gerekli Kimlik sütununa sahip tablo oluşturun.

  • +0

    Evet, bu tam olarak düşündüğüm şeyin tipi. Tip-dökümün şeffaf bir şekilde ele alınmasının bir yolu olabileceğini umuyordum, ama mermiyi ısırmak ve yapmak zorunda kalacağım gibi görünüyor. Bu durumda, target_object_id öğesinin yanı sıra muhtemelen hedef nesnenin System.Type'ı olacak olan comment_type'ı da kontrol etmeliyim. Bununla çok çalışmam gerekmedim, o yüzden öğreneceğim. – Josh

    +0

    Bu, amacınızın, veritabanındaki, orijinal sorudan aldığım tablo sayısını azaltmak olduğu varsayılıyor. Her yorum türü için "mapper tabloları" oluşturmaya eğilimli olabilirim, ancak tüm yorumları bir yorum tablosunda tutmaya devam edebilirim. Post_id sütunu ve bir comment_id sütunu içeren bir "post_comments" tablosuna sahipseniz, görünümünüz veya modeliniz belirli bir posta kimliği için yorumlar gerektirdiğinde sorgulayabilirsiniz. – Jay

    +0

    Evet, doğru, tablo sayısını ve yazılması gereken kod miktarını azaltmak için. Mükemmel bir dünyada, Ruby'nin karışımları gibi bir şey işe yarayacaktı, ama bu gerçekten C# 'da mümkün değil. Büyük bir anlaşma değil, sadece bir şeyi kaçırdığımı umuyordum. – Josh

    2

    Bunu LinqToSql ve kısmi sınıflarıyla gerçekleştiriyorum. Bir arabirimi uygulamak istediğim her sınıf için, arabirimi uygulamak için sınıfı bildiren kısmi sınıfın bir bölümünü içeren araçla oluşturulmayan bir dosya oluşturmaya gidiyorum. Örneğin

    :

    Oluşturulan kod:

    // this code is generated by a tool blah blah 
    partial class FooComment { 
        // all the generated crap 
        string Author { 
         // ... 
        } 
        // etc 
    } 
    

    arayüzü:

    interface IComment{ 
        string Author{ get; } 
        // etc 
    } 
    

    Kodum: Artık

    // lovingly hand-written by me 
    partial class FooComment : IComment { 
    } 
    

    , herhangi bir grup döküm istiyorsanız FooComments'dan IComment'e, bize e Cast linq uzantısı yöntemi:

    db.FooComments.Cast<IComment>() 
    
    +0

    Evet, düşündüğüm çözüm budur.Tipik olarak, türünü şeffaf bir şekilde ele alacak bir yol olabileceğini umuyordum, ancak genel bir işlev muhtemelen alacağım en iyisidir. – Josh

    İlgili konular