无法更改该关系,因为在EF中删除时,一个或多个外键属性不可为空

问题描述 投票:0回答:1

我正在使用EntityFramework 6.2,而我使用ObjectContext

这是我的承诺方式:

    public void Commit()
    {
        List<ObjectContext> objectContexts = DataContextFactory.GetDataContexts(_boundedDataContextEnums);
        var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.Serializable });

        using (transactionScope)
        {
            foreach (ObjectContext objectContext in objectContexts)
            {
                IEnumerable<object> AddedCollection = from e in objectContext.ObjectStateManager.GetObjectStateEntries
                                                 (EntityState.Added)
                                                      select e.Entity;

                objectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
                foreach (object addedEntity in AddedCollection)
                {
                    if (addedEntity != null)
                    {
                        objectContext.Detach(addedEntity);
                    }
                }
            }

            transactionScope.Complete();
            foreach (ObjectContext objectContext in objectContexts)
            {
                objectContext.AcceptAllChanges();
            }
        }
    }

[尝试从数据库中删除记录时遇到问题。

我有两个表:具有一对多关系的ProjectProjectComponent,这意味着每个Project可以具有一对多ProjectComponent

我已经用no DELETE CASCADE定义了这种关系。

Project表中有两个记录,ProjectComponent表中都有两个子记录。

[当我尝试从SQL Server的'Project'表中删除这两个记录中的任何一条时,由于预期的原因,我会收到以下消息(因为没有删除级联):

Msg 547, Level 16, State 0, Line 12
The DELETE statement conflicted with the REFERENCE constraint "FK_ProjectComponent_Project". The conflict occurred in database "APADataBase1", table "Infrastructure.ProjectComponent", column 'ProjectID'.

问题是,当我尝试使用我发布的提交方法从应用程序级别删除这些记录之一时,对于其中一条记录,SqlException会与SQL Server内部的确切发布消息一起抛出,而对于另一条记录抛出系统异常,没有内部SqlException并显示以下消息:

`ExceptionMessage:

操作失败:无法更改该关系,因为一个或多个外键属性不可为空。当一个更改关系后,相关外键属性为设置为空值。如果外键不支持空值,必须定义一个新的关系,外键属性必须是分配另一个非空值,否则不相关的对象必须是已删除。

StackTraceMessage:

在System.Data.Entity.Core.Objects.ObjectContext.PrepareToSaveChanges(SaveOptions选项)System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions选项,布尔值executeInExistingTransaction)APA.Repository.SharedKernel.UnitOfWork.EFUnitOfWork.Commit()在D:\ Projects \ Framework \ 2017-SubDomain \ APA \ APA.Repository \ SharedKernel \ UnitOfWork \ EFUnitOfWork.cs:line43岁APA.Service.SharedKernel.Services.GenericService1.Remove(ServiceRequest serviceRequest, Expression1谓词,字符串D:\ Projects \ Framework \ 2017中的FileSavingRootMappedPath)-SubDomain \ APA \ APA.Service \ SharedKernel \ Services \ Implementations \ GenericService.cs:line326

c# entity-framework
1个回答
0
投票

ProjectComponent表中的行引用了您要删除的Project

© www.soinside.com 2019 - 2024. All rights reserved.