C# 在这种情况下,如何对实体执行级联删除?
如何让entity framework从EsignatureDocument中删除字段和事件(定义如下),而不会导致错误?我怀疑我可以编写一些模型构建代码,使用EntityTypeConfiguration在DbContext中的应用程序启动时执行这些代码。。。以下示例的生成器代码是什么 我有一块很短的C#能用。这是:C# 在这种情况下,如何对实体执行级联删除?,c#,entity-framework,C#,Entity Framework,如何让entity framework从EsignatureDocument中删除字段和事件(定义如下),而不会导致错误?我怀疑我可以编写一些模型构建代码,使用EntityTypeConfiguration在DbContext中的应用程序启动时执行这些代码。。。以下示例的生成器代码是什么 我有一块很短的C#能用。这是: var document = _repo.Load<EsignatureDocument>(input.EsignatureDocumentId); doc
var document = _repo.Load<EsignatureDocument>(input.EsignatureDocumentId);
document.Events.Clear();
document.Fields.Clear();
_repo.SaveChanges();
Clear()删除对父实体的引用,而不是子实体本身
问题是,当调用document.Fields.Clear()时,它将使字段实体上的EsignatureDocumentId列为空。这是不允许的,因为EsignatureDocumentId不可为空,因此您不能拥有没有父文档的字段。
您应该将该列标记为可空,或者应该使用:
foreach(var f in document.Field)
{
Context.DeleteObject(f); //or fieldRepo.Delete(f) or something that fits for
}
如果调用
RemoveAll(t=>true)
而不是Clear()
在HashSet上没有RemoveAll,但是当我执行document.Fields.RemoveWhere(x=>x.esignateDocumentId==input.esignateDocumentId)时会发生什么;当我从HashSet更改为List并执行RemoveAll时,仍然会出现相同的错误
CREATE TABLE [dbo].[EsignatureDocumentEvent](
[Id] [uniqueidentifier] NOT NULL,
[EsignatureDocumentId] [uniqueidentifier] NOT NULL,
[Action] [int] NOT NULL,
[ActionName] [varchar](50) NOT NULL,
[FieldsJson] [varchar](max) NULL,
[DocumentPdf] [varchar](1000) NULL,
[CreatedDate] [datetime] NOT NULL,
CONSTRAINT [PK_EsignatureDocumentEvent] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[EsignatureDocumentEvent] WITH CHECK ADD CONSTRAINT [FK_EsignatureDocumentEvent_EsignatureDocument] FOREIGN KEY([EsignatureDocumentId])
REFERENCES [dbo].[EsignatureDocument] ([Id])
GO
ALTER TABLE [dbo].[EsignatureDocumentEvent] CHECK CONSTRAINT [FK_EsignatureDocumentEvent_EsignatureDocument]
GO
CREATE TABLE [dbo].[EsignatureDocumentField](
[Field_Id] [int] NOT NULL,
[Field_Name] [varchar](100) NOT NULL,
[Field_Value] [varchar](1000) NOT NULL,
[Field_Type] [varchar](100) NOT NULL,
[EsignatureDocumentId] [uniqueidentifier] NOT NULL,
PRIMARY KEY CLUSTERED
(
[Field_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[EsignatureDocumentField] WITH CHECK ADD CONSTRAINT [FK_EsignatureDocumentField_EsignatureDocument] FOREIGN KEY([EsignatureDocumentId])
REFERENCES [dbo].[EsignatureDocument] ([Id])
GO
ALTER TABLE [dbo].[EsignatureDocumentField] CHECK CONSTRAINT [FK_EsignatureDocumentField_EsignatureDocument]
GO
foreach(var f in document.Field)
{
Context.DeleteObject(f); //or fieldRepo.Delete(f) or something that fits for
}