2010-11-08 53 views
0

我有一個EF模型,我在邏輯上有一個「模板」型和實體框架繼承創建coresponding實體

基本上我的模板是像工作流和實例是那些模板「的模板類型的實例」應用於對象。該關聯是一個模板有零到多個實例,一個實例總是基於一個模板。例如,模板可以是「發送信件」,其被髮送給客戶以創建發送的信件的實例,其包括髮送日期,該信件的pdf等。

該模板具有幾個子類/類型它將始終匹配也具有相應子類的實例。

問題是如何確保當我創建一個實例(它將有一個對模板的引用)時,該實例具有正確的繼承類型。

例如,如果模板的類型是TemplateType2(從模板繼承),並且我將實例添加到loan1 .. loan1.TemplateInstances.add(foo)...我想確保foo的類型爲InstanceType2。

我現在這樣做的方式似乎是這樣的黑客攻擊。我將實例實體名稱作爲標量值存儲在模板實體中,並使用反射來創建正確類型的實例。

它可以工作,但它基本上使用屬性的值來進行映射,如果它們與實例名稱的名稱不匹配,或者如果它們輸入錯誤的實體名稱會更糟糕,從而暴露各種錯誤的可能性。

任何想法或想法如何解決這個問題?

回答

0

我最終通過一些破解來解決這個問題。 我使用了命名約定,並將自己的處理程序添加到上下文savingchanges方法 ,然後進行了一些反思。不是最好的解決方案,但它工作。

主要部分...

For Each entry As ObjectStateEntry In DirectCast(sender, ObjectContext).ObjectStateManager.GetObjectStateEntries(EntityState.Added) 
      If Not entry.IsRelationship Then 

[blah blah...snip]  

ObjectName = Me.GetType.ToString 
        If ObjectName = "QSEntityFrameWork.TaskTemplate" Then 
         ObjectName = "QSEntityFrameWork.TaskInstance" 
        Else 
         ObjectName = ObjectName.Replace("Task", "Instance") 
        End If 
        oh = Activator.CreateInstance("QSEntityFrameWork", ObjectName) 
        Dim obj As Object = oh.Unwrap 
        obj.TaskTemplateID = Me.TaskTemplateID 
        obj.TaskStartDate = DateTime.Now 
        obj.ProcessInstanceID = ProcessIntanceID 
        Return obj