2010-11-08 2 views
0

У меня есть модель EF, где я логически иметь тип «шаблон» и «экземпляр шаблонного типа»Entity Framework наследование создания coresponding объект

В основном мои шаблоны как поток работы и экземпляры являются теми шаблонами применяется к объекту. Связь заключается в том, что шаблон имеет от нуля до многих экземпляров, экземпляр всегда основан на шаблоне. Например, шаблон может быть «отправить письмо», который применяется к клиенту для создания экземпляра отправленного письма, который включает отправленную дату, pdf-письмо и т. Д.

Шаблоны имеют несколько подклассов/типов который всегда будет соответствовать экземпляру, который также имеет соответствующий подкласс.

Проблема заключается в том, как я могу гарантировать, что когда я создам экземпляр (который будет иметь ссылку на шаблон), что экземпляр имеет правильный унаследованный тип.

Например, если шаблон имеет тип TemplateType2 (наследует от шаблона), и я добавляю экземпляр в loan1 .. loan1.TemplateInstances.add (foo) ... Я хочу, чтобы foo имел тип InstanceType2.

То, как я делаю это сейчас, похоже на такой взлом. Я сохраняю имя сущности экземпляра как скалярное значение в объекте шаблона и используя отражение для создания правильного типа экземпляра.

Это работает, но в основном используется значение свойства для отображения, отображающего возможность всех видов ошибок, если они не совпадают с именем имени экземпляра, или, что еще хуже, если они вводят неправильное имя объекта ,

Любые идеи или мысли, как решить эту проблему?

ответ

0

В итоге я решил это немного взломать. Я использовал соглашения об именах и добавляю свой собственный обработчик к контексту savechanges метод , а затем немного отражения. Не лучшее решение, но оно работает.

основная часть ...

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 
Смежные вопросы