实体框架继承创建相应的实体

时间:2010-11-08 17:55:53

标签: entity-framework-4

我有一个EF模型,我逻辑上有一个“模板”类型和一个“模板类型的实例”

基本上我的模板就像工作流程,实例是应用于对象的模板。关联是模板具有零到多个实例,实例总是基于模板。例如,模板可以是“发送信件”,它被应用于客户以创建发送的信件的实例,其中包括发送的日期,信件的pdf等。

模板有一些子类/类型,它们总是匹配一个也有相应子类的实例。

问题是如何确保在创建实例(将具有对模板的引用)时实例具有正确的继承类型。

例如,如果模板的类型为TemplateType2(从模板继承),我将一个实例添加到loan1 .. loan1.TemplateInstances.add(foo)...我想确保foo的类型为InstanceType2。

我现在这样做的方式看起来像是一个黑客。我将实例实体名称存储为模板实体中的标量值,并使用反射创建实例的正确类型。

它可以工作,但它基本上使用属性的值来进行映射,如果它们与实例名称的名称不匹配则暴露出各种错误的可能性,或者如果它们输入错误的实体名称则更糟。

如何解决这个问题的想法或想法?

1 个答案:

答案 0 :(得分:0)

我最后通过一些黑客来解决这个问题。 我使用命名约定并将自己的处理程序添加到context 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