Как получить структуру сущности для удаления полей и событий (определенных ниже) из документа EsignatureDocument, не вызывая ошибки? Я подозреваю, что есть какой-то код построения модели, который я мог бы написать, который выполняется при запуске приложения в DbContext, используя EntityTypeConfiguration ... Что будет для кода строителя для следующего примера.Как выполнить каскадные удаления на моих объектах в этой ситуации?
У меня есть короткий кусок C#, который действительно работает. Вот оно:
var document = _repo.Load<EsignatureDocument>(input.EsignatureDocumentId);
document.Events.Clear();
document.Fields.Clear();
_repo.SaveChanges();
Когда я называю это, я получаю следующее сообщение об ошибке:
The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
Субъект каркасные классы следующим образом:
[Table("EsignatureDocument", Schema = "dbo")]
public class EsignatureDocument
{
public EsignatureDocument()
{
Events = new HashSet<EsignatureDocumentEvent>();
}
public Guid Id { get; set; }
public DateTime CreatedDate { get; set; }
[MaxLength(10)]
public string DocumentReference { get; set; }
[MaxLength(100)]
public string CreatedBy { get; set; }
[MaxLength(300)]
public string EnvelopeTitle { get; set; }
[MaxLength(500)]
public string Path { get; set; }
[MaxLength(500)]
public string SignedPath { get; set; }
[MaxLength(200)]
public string SignedUrl { get; set; }
[MaxLength(200)]
public string SignableUrl { get; set; }
public DateTime? SignedDate { get; set; }
[MaxLength(32)]
public string EnvelopeFingerprint { get; set; }
public bool SentByEmail { get; set; }
public bool SentBySms { get; set; }
[MaxLength(200)]
public string EmailAddress { get; set; }
[MaxLength(20)]
public string MobileNumber { get; set; }
[MaxLength(100)]
public string LetterReference { get; set; }
public virtual HashSet<EsignatureDocumentEvent> Events { get; set; }
public virtual HashSet<EsignatureDocumentField> Fields { get; set; }
[NotMapped]
public bool IsSigned
{
get { return !string.IsNullOrWhiteSpace(SignedPath); }
}
[NotMapped]
public EsignatureDocumentEvent LatestEvent
{
get { return Events.OrderByDescending(x => x.CreatedDate).FirstOrDefault(); }
}
}
[Table("EsignatureDocumentEvent", Schema = "dbo")]
public class EsignatureDocumentEvent : EntityBase
{
public Guid EsignatureDocumentId { get; set; }
public SignableAction Action { get; set; }
[MaxLength(50)]
public string ActionName { get; set; }
[NotMapped]
public string ActionDisplayName {
get
{
return char.ToUpper(ActionName[0]) + ActionName.Substring(1).ToLower().Replace("_envelope", string.Empty);
}
}
public string FieldsJson { get; set; }
[MaxLength(1000)]
public string DocumentPdf { get; set; }
public DateTime CreatedDate { get; set; }
}
[Table("EsignatureDocumentField", Schema = "dbo")]
public class EsignatureDocumentField
{
[Key]
public int Field_Id { get; set; }
public string Field_Value { get; set; }
public string Field_Name { get; set; }
public string Field_Type { get; set; }
public virtual EsignatureDocument EsignatureDocument { get; set; }
public Guid EsignatureDocumentId { get; set; }
}
Script для дочерних таблиц следующим образом:
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
Что произойдет, если вы звоните 'RemoveAll (т => верно)' вместо 'Clear()' – 3dd
Там нет RemoveAll на HashSet но когда я делаю document.Fields.RemoveWhere (x => x.EsignatureDocumentId == input.EsignatureDocumentId); Он по-прежнему не работает с той же ошибкой –
CarneyCode
Когда я перехожу из HashSet в List и выполняю RemoveAll, я все равно получаю ту же ошибку – CarneyCode