Исключение Связь не может быть изменена, так как одно или несколько свойств внешнего ключа не могут иметь значение null при удалении - PullRequest
0 голосов
/ 06 мая 2019

У меня есть эта модель в моем проекте WCF и я использую Entity Framework 6 для своей ORM.

    [DataContract(IsReference = true)]
        public class ProductSerialInfo
        {
            [DataMember]
            public int WorkOrderNo { get; set; }
            [DataMember]
            public decimal ProductMainSerial { get; set; }        
            [DataMember]
            public string ProductCode { get; set; }
            [DataMember]
            public int GroupId { get; set; }
            [DataMember]
            public int TestIndex { get; set; }
            [DataMember]
            public BindingList<ProductSerialInfoControlSupervisor> ControlSupervisorList { get; set; }
            [DataMember]
            public BindingList<ProductFault> ProductFaultList { get; set; }
        }

    [DataContract(IsReference = true)]
        public class ProductSerialInfoControlSupervisor
        {
            [DataMember]
            public int WorkOrderNo { get; set; }
            [DataMember]
            public decimal ProductMainSerial { get; set; }
            [DataMember]
            public string ProductCode { get; set; }        
            [DataMember]
            public int TestIndex { get; set; }
            [DataMember]
            public int ControlSupervisorId { get; set; }
            [DataMember]
            public int CreateUserId { get; set; }
            [DataMember]
            public int ChangeUserId { get; set; }
            [DataMember]
            public DateTime CreateDate { get; set; }
            [DataMember]
            public DateTime ChangeDate { get; set; }
            [DataMember]
            public byte[] RowVersion { get; set; }
            [DataMember]
            public virtual ProductSerialInfo ProductSerialInfo { get; set; }
            [DataMember]
            public virtual ProductSupervisor ProductSupervisor { get; set; }
        }

[DataContract(IsReference = true)]
    public class ProductFault
    {
        [DataMember]
        public int WorkOrderNo { get; set; }
        [DataMember]
        public decimal ProductMainSerial { get; set; }
        [DataMember]
        public string ProductCode { get; set; }
        [DataMember]
        public int TestIndex { get; set; }
        [DataMember]
        public int FaultId { get; set; }

        [DataMember]
        public int FaultCount { get; set; }
        [DataMember]
        public string FaultComment { get; set; }

        [DataMember]
        public virtual ProductSerialInfo FinalProductFault { get; set; }

    }

Когда я пытаюсь удалить объект типа экземпляра ProductSerialInfo, я получаю исключение

The relationship could not be changed because one or more of the foreign-key properties is non-nullable

.Мой метод удаления выглядит следующим образом:

public virtual void Delete(T entity)
        {
            DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
            if (dbEntityEntry.State != EntityState.Deleted)
            {
                dbEntityEntry.State = EntityState.Deleted;
            }
            else
            {
                DbSet.Attach(entity);
                DbSet.Remove(entity);
            }
        }

, который является общим.И его использование таково:

public int SaveProductSerialInfo(List<ProductSerialInfo> productSerialInfo)
        {
            try
            {
                int workOrderNo = productSerialInfo.ElementAt(0).WorkOrderNo;
                string productCode = productSerialInfo.ElementAt(0).ProductCode;
                decimal productMainSerial = productSerialInfo.ElementAt(0).ProductMainSerial;
                int testIndex = productSerialInfo.ElementAt(0).TestIndex;

                ProductSerialInfo itemToManage = Uow.ProductSerialInfo.GetAllByCondition(x => x.ProductCode.Trim() == productCode && x.TestIndex == testIndex && x.ProductMainSerial == productMainSerial && x.WorkOrderNo == workOrderNo).FirstOrDefault();
                if (itemToManage != null)
                {
                    Uow.ProductSerialInfo.Delete(itemToManage);
                    Uow.Commit();
                }

                foreach (var item in productSerialInfo)
                {                    
                    Uow.ProductSerialInfo.Add(item);
                    Uow.Commit();
                }

            }
            catch (Exception ex)
            {
                return 0;
            }

            return 1;
        }

А конфигурация для класса ProductSerialInfo установлена ​​каскадно при удалении, что означает, что он должен удалять связанные экземпляры ProductSerialInfoControlSupervisor и ProductFault из базы данных.

public class ProductSerialInfoConfiguration : EntityTypeConfiguration<ProductSerialInfo>
    {
        public ProductSerialInfoConfiguration()
        {
            HasKey(x => new { x.ProductCode, x.WorkOrderNo, x.ProductMainSerial, x.TestIndex});                
            Property(t => t.GroupId)
              .IsRequired()
              .HasColumnName("GroupId");
            Property(t => t.ProductCode)
              .IsRequired()
              .HasColumnName("ProductCode");

            Property(t => t.TestIndex)
              .IsRequired()
              .HasColumnName("TestIndex");

            HasMany(x => x.ProductFaultList)
                .WithRequired(x => x.FinalProductFault)
                .HasForeignKey(x => new { x.ProductCode, x.WorkOrderNo, x.ProductMainSerial, x.TestIndex })
                .WillCascadeOnDelete(true);
            HasMany(x => x.ControlSupervisorList)
                .WithRequired(x => x.ProductSerialInfo)
                .HasForeignKey(x => new { x.ProductCode, x.WorkOrderNo, x.ProductMainSerial, x.TestIndex })
                .WillCascadeOnDelete(true);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...