C# 实体框架(核心),保存包含必填字段的不完整模型
使用:dotnetcore1.1,实体框架代码优先,sqlserver 有没有一种优雅的方法可以让用户在一个大型表单上工作,该表单由一个complexe模型(40多个表/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
[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很简单,并且所需的信息不能始终及时提供。感谢您的回答,我们也考虑过如何进行谨慎的输入,但填写表格的过程远非简单,并且所需的信息不能始终及时提供。