Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-存储各种类型_C#_Entity Framework - Fatal编程技术网

C# 实体框架-存储各种类型

C# 实体框架-存储各种类型,c#,entity-framework,C#,Entity Framework,我正在为一些表单构建一个工作流,它将发送给用户进行审批。我有一个抽象的“FormBase”类,它存储“Approver”对象的LinkedList,并有一些帮助程序,可以修改Approver列表,将表单移动到下一个人,等等。这些助手都是“虚拟的”,因此给定的表单可以使用自定义行为覆盖它们 从这个“基础”将产生各种形式的实例,每种形式所包含的数据都不同。它将是一组正常的列表、字符串和数值,您可以在一个正常的表单中找到它们。所以我可能有 class MaterialForm : FormBase

我正在为一些表单构建一个工作流,它将发送给用户进行审批。我有一个抽象的“FormBase”类,它存储“Approver”对象的LinkedList,并有一些帮助程序,可以修改Approver列表,将表单移动到下一个人,等等。这些助手都是“虚拟的”,因此给定的表单可以使用自定义行为覆盖它们

从这个“基础”将产生各种形式的实例,每种形式所包含的数据都不同。它将是一组正常的列表、字符串和数值,您可以在一个正常的表单中找到它们。所以我可能有

 class MaterialForm : FormBase
 class CustomerForm : FormBase
当用户创建并提交表单时,将创建一个新实例

我希望以一种灵活的方式在EF6(或5)中保留的字段详细信息,这样我就可以创建更多从FormBase派生的表单,而无需太多修改。理想情况下,我希望特定于该表单类型的所有行为都存在于MaterialForm派生类中。我想我不能将这个派生类持久化到EF(除非我错了!)。我正在考虑:

a) jsonifig字段详细信息,并将其作为字符串存储在类中,该类将存储到EF。我可能也会对审批人列表做同样的操作,每次我需要修改列表时,我都会将它们拉出,修改列表并将它们推回

b) 在我的抽象类中包含“FormData”属性,然后在每个具体实现中包含该属性的派生版本(例如MaterialFormData、CustomPerformData)。然而,抽象类似乎不喜欢我以这种方式使用派生类型。还不清楚在这种情况下如何设置DBSET,因为您可能需要为每种类型创建一个新表


我觉得我误解了“真实”类与EF中存储的类之间的关系。对于这种情况,您会推荐什么体系结构?

对于实体框架,您有三种受支持的继承模型:每类型表(TPT)、每层次表(TPH)和每具体类表(TPC)

TPC的使用通常是被避免的,而在其他两种方法之间的选择取决于几个因素,包括性能和灵活性。有一篇很好的文章概述了这些差异

我还建议阅读和阅读更多关于这些模式如何工作的信息和示例

然而,在您的示例中,就为您的应用程序提供合适的“模型”而言,问题似乎处于“设计”阶段。我的建议是,如果你觉得你提出的类结构不能准确地表示你正在使用的模型,你要么需要改变结构;你的模型非常复杂;或者您受到外部系统(例如,无法更改的数据库模式)的约束

在本例中,您是否考虑过制作类图?即使您使用EF designer,也要尝试并可视化模型,因为这通常是确定可以在何处进行改进的最佳方法,并且还为您的设计提供了一个良好的开端(特别是如果您首先编写代码的话)


试试看,如果有必要,把它贴回这里。如果需要,我们可以帮助重新设计模型。我的感觉是,几乎总是有一些很好的方法可以用一个像样的OO透视图来表示您的需求,在考虑更详细的选项之前,最好先对其进行分析!这里的关键是,如果可以避免的话,避免考虑动态创建新的类类型

谢谢你的评论,尼克。好的链接。