2015-05-20 3 views
1

Как получить структуру сущности для удаления полей и событий (определенных ниже) из документа 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 
+0

Что произойдет, если вы звоните 'RemoveAll (т => верно)' вместо 'Clear()' – 3dd

+0

Там нет RemoveAll на HashSet но когда я делаю document.Fields.RemoveWhere (x => x.EsignatureDocumentId == input.EsignatureDocumentId); Он по-прежнему не работает с той же ошибкой – CarneyCode

+0

Когда я перехожу из HashSet в List и выполняю RemoveAll, я все равно получаю ту же ошибку – CarneyCode

ответ

0

Clear() удаляет ссылку на родителя, а не на дочерний объект.

Проблема заключается в том, что при вызове документа.Fields.Clear() он аннулирует столбец EsignatureDocumentId объекта Field. Это недопустимо, так как EsignatureDocumentId не имеет значения NULL, поэтому вы не можете иметь поле без родительского документа. Либо вы должны пометить столбец как обнуляемым, или вам следует использовать:

foreach(var f in document.Field) 
{ 
    Context.DeleteObject(f); //or fieldRepo.Delete(f) or something that fits for 
} 
Смежные вопросы