C# 实体框架(核心),保存包含必填字段的不完整模型

C# 实体框架(核心),保存包含必填字段的不完整模型,c#,sql-server,entity-framework,validation,asp.net-core,C#,Sql Server,Entity Framework,Validation,Asp.net Core,使用:dotnetcore1.1,实体框架代码优先,sqlserver 有没有一种优雅的方法可以让用户在一个大型表单上工作,该表单由一个complexe模型(40多个表/C#对象)表示,具有多个“必需”字段,可以临时保存它的工作,然后再回来完成它 假设我有这个模型: [Table("IdentificationInfo", Schema = "Meta")] public class IdentificationInfo : PocoBase { [...] public in

使用:dotnetcore1.1,实体框架代码优先,sqlserver

有没有一种优雅的方法可以让用户在一个大型表单上工作,该表单由一个complexe模型(40多个表/C#对象)表示,具有多个“必需”字段,可以临时保存它的工作,然后再回来完成它

假设我有这个模型:

[Table("IdentificationInfo", Schema = "Meta")]
public class IdentificationInfo : PocoBase
{ 
    [...]
    public int MetaDataId { get; set; }
    [ForeignKey("MetaDataId")]
    public virtual MetaData MetaData { get; set; }

    public int ProgressId { get; set; }
    [ForeignKey("ProgressId")]
    public Progress Progress { get; set; }

    public virtual MaintenanceInfo MaintenanceInfo { get; set; }

    public int PresentationFormId { get; set; }
    [ForeignKey("PresentationFormId")]
    public PresentationForm PresentationForm { get; set; }

    private string _abstract;
    [Required]
    public string Abstract
    {
        get { return _abstract; }
        set { SetFieldValue(ref _abstract, value, "Abstract"); }
    }
    [...]
}

[Table("PresentationForm", Schema = "Meta")]
public class PresentationForm : PocoEnumeration
{
    [...] 
}
用户开始填写所有内容(在一个包含多个选项卡或非常长的页面的大表单中!),但需要停止并保存进度,而没有时间保存以填写
呈现表单
部分,也没有时间填写
摘要
。通常,在
数据库
中,这些字段是非空的,因此当我们试图保存模型时,它将失败。类似地,在UI中进行EF验证时也会失败

最好是使用
Progress
属性并禁用EF模型验证
(model.isValid())
,同时启用
数据库插入
,即使字段为(不可能将默认值放在那些不可为空的字段中,因为它们通常是类枚举表的外键)

对于模型验证部分,我知道我们可以制作一些自定义的验证器,带有自定义注释,例如
[RequiredIf(“FieldName”、“Value”、“Message”)]
。我真的很想知道在
数据库中做类似事情的一些方法

要做到这一点,最简单的方法是将模型保存为一个临时表中的
JSON
,只要进度状态未完成,在需要编辑时直接从
JSON
,并仅在状态完成时将其保存到
数据库中吗?

以支持(优雅地)你所要求的应该是这样设计的。 一个包含必填列的表应该是在任何保存之前必须输入的最小段。应该使段的大小达到最佳。 您可以设置所有字段允许NULL,但这将是非常糟糕的设计,所以我根本不考虑这个选项。 现在,如果您的输入由多个逻辑部分组成,并且在表单上,它们可以是不同的选项卡,因此每个选项卡都位于Db中的一个表中,主表具有其他表的FKs。 该FK可以为空,它将使您能够完成前两个选项卡,保存它,并将其余选项卡留到后面。这样您就知道,具有值的FK列已完成(并且可能仍可以编辑),而其他列尚未插入。您还可以具有列状态:Draft/Active/

更重要的是,这种设计允许您拥有可配置的选项卡,因此,例如,根据主输入上的一些选择,您可以选择哪些表可以输入,哪些表不可以输入,并启用/禁用相应的选项卡

然而,若你们不希望FKs为空,那个么解决方案将是一些临时存储,一个选项是一个字符串列中的JSON,正如你们自己所提到的。但我认为在这种情况下,可空FKs并没有问题。

为了支持(优雅地)你们所要求的,你们应该这样设计它。 一个包含必填列的表应该是在任何保存之前必须输入的最小段。应该使段的大小达到最佳。 您可以设置所有字段允许NULL,但这将是非常糟糕的设计,所以我根本不考虑这个选项。 现在,如果您的输入由多个逻辑部分组成,并且在表单上,它们可以是不同的选项卡,因此每个选项卡都位于Db中的一个表中,主表具有其他表的FKs。 该FK可以为空,它将使您能够完成前两个选项卡,保存它,并将其余选项卡留到后面。这样您就知道,具有值的FK列已完成(并且可能仍可以编辑),而其他列尚未插入。您还可以具有列状态:Draft/Active/

更重要的是,这种设计允许您拥有可配置的选项卡,因此,例如,根据主输入上的一些选择,您可以选择哪些表可以输入,哪些表不可以输入,并启用/禁用相应的选项卡


但是,如果您不希望FKs可为空,那么解决方案将是一些临时存储,其中一个选项是一个字符串列中的JSON,正如您所提到的。但我认为在这种情况下,可为空的FKs没有任何问题。

感谢您的回答,我们也考虑过创建离散输入组,但填写表单的过程远远不够rom很简单,并且所需的信息不能始终及时提供。感谢您的回答,我们也考虑过如何进行谨慎的输入,但填写表格的过程远非简单,并且所需的信息不能始终及时提供。