Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 实体框架扩展-简单删除给我空引用_Linq_C# 4.0_Entity Framework Extended - Fatal编程技术网

Linq 实体框架扩展-简单删除给我空引用

Linq 实体框架扩展-简单删除给我空引用,linq,c#-4.0,entity-framework-extended,Linq,C# 4.0,Entity Framework Extended,我已经从nuget获取了Entity Framework扩展源代码,我想使用它的delete表达式使用ID删除多行数据 在我的代码中,我使用PersonID获取ClaimsID。在两个表中,ClaimsID是一个FK,我从中删除的最后一个表是PK。由于键的限制,我按此顺序操作 出于某种原因,它给了我一个空引用: public void DeleteClaims(string _PersonID) { Guid PersonID = Guid.Parse(_

我已经从nuget获取了Entity Framework扩展源代码,我想使用它的delete表达式使用ID删除多行数据

在我的代码中,我使用PersonID获取ClaimsID。在两个表中,ClaimsID是一个FK,我从中删除的最后一个表是PK。由于键的限制,我按此顺序操作

出于某种原因,它给了我一个空引用:

public void DeleteClaims(string _PersonID)
        {
            Guid PersonID = Guid.Parse(_PersonID);
            try
            {
                using (CasaLatinaEntities CasaLatinaEntities = new CasaLatinaEntities())
                {
                    //Delete all FKs first before deleting parent data 
                    var tblClaims = CasaLatinaEntities.tblClaims.Where(c => c.PersonID == PersonID);
                    List<Guid> IDs = tblClaims.Select(c => c.ClaimID).ToList();

                    foreach (var ID in IDs)
                    {
                        var ClaimAction = from c in CasaLatinaEntities.tblClaimActions
                                          where c.ClaimID == ID
                                          select c;

                        var ClaimTypes = from c in CasaLatinaEntities.tblClaimTypes
                                         where c.ClaimID == ID
                                         select c;


                        if (ClaimAction.Count() > 0)
                        {
                            CasaLatinaEntities.tblClaimActions.Delete(c => c.ClaimID == ID);
                            CasaLatinaEntities.tblClaimTypes.Delete(c => c.ClaimID == ID);
                            CasaLatinaEntities.tblClaims.Delete(c => c.ClaimID == ID);
                        }
                        else if (ClaimTypes.Count() > 0)
                        {
                            CasaLatinaEntities.tblClaimTypes.Delete(c => c.ClaimID == ID);
                            CasaLatinaEntities.tblClaims.Delete(c => c.ClaimID == ID);
                        }
                        else
                        {
                            CasaLatinaEntities.tblClaims.Delete(c => c.ClaimID == ID);
                        }
                    }

                    //CasaLatinaEntities.tblClaimActions.Delete(c => c.ClaimID == ClaimId);
                    //CasaLatinaEntities.tblClaimTypes.Delete(c => c.ClaimID == ClaimId);
                    //CasaLatinaEntities.tblClaims.Delete(c => c.ClaimID == ClaimId);
                }
            }
            catch (Exception ex)
            {

            }

        }
我试图注释掉这段代码,但每次尝试删除都会中断

堆栈跟踪

CasaLatinaEntities.tblClaimActions.Delete(c => c.ClaimID == ClaimId);
   at EntityFramework.Mapping.ReflectionMappingProvider.SetProperties(EntityMap entityMap, Object mappingFragmentProxy)
   at CallSite.Target(Closure , CallSite , Type , EntityMap , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid3[T0,T1,T2](CallSite site, T0 arg0, T1 arg1, T2 arg2)
   at EntityFramework.Mapping.ReflectionMappingProvider.CreateEntityMap[TEntity](ObjectQuery query)
   at EntityFramework.Mapping.ReflectionMappingProvider.GetEntityMap[TEntity](ObjectQuery query)
   at EntityFramework.Mapping.MappingResolver.GetEntityMap[TEntity](ObjectQuery query)
   at EntityFramework.Extensions.BatchExtensions.Delete[TEntity](IQueryable`1 source)
   at EntityFramework.Extensions.BatchExtensions.Delete[TEntity](IQueryable`1 source, Expression`1 filterExpression)
   at DataLayer.RepositoryClient.DeleteClaims(String _PersonID) in c:\Users\nickgowdy\Documents\Visual Studio 2012\Projects\CasaLatina\DataLayer\RepositoryClient.cs:line 876

这不是很多代码,所以我不理解空引用的作用。所有三个表中都存在数据行。

由于FirstOrDefault不能返回任何记录,您可能需要先检查它,然后再继续:

//Delete all FKs first before deleting parent data 
var tblClaims = CasaLatinaEntities.tblClaims.Where(c => c.PersonID == PersonID);
Guid ClaimId = tblClaims.Select(c => c.ClaimID).FirstOrDefault();

if (ClaimId != null)
{
   CasaLatinaEntities.tblClaimActions.Delete(c => c.ClaimID == ClaimId);
   CasaLatinaEntities.tblClaimTypes.Delete(c => c.ClaimID == ClaimId);
   CasaLatinaEntities.tblClaims.Delete(c => c.ClaimID == ClaimId);
}

最新的实体框架扩展是为实体框架版本6.0编写的。您正在尝试将其用于EntityFramework6.1,该版本几天前发布,目前还不受支持


暂时尝试使用Remove()/RemoveRange(),直到他们生成EF:Extended的固定版本。

在哪一行引发了null引用异常?@har07 casalatinatentis.tblclaimations.Delete(c=>c.ClaimID==ClaimID);。我的上下文包含数据。当引发异常时,是否可以检查
ClaimId
变量值?表中是否有与该值匹配的数据?我对EF扩展库没有经验,这是我最好的猜测:如果没有要删除的数据(没有数据匹配条件),EF扩展将抛出异常。让我猜猜。。。您尝试将EF6.1与EF6.0扩展工具一起使用,对吗?我这么问是因为我知道,我得到了完全相同的例外。看来@KornélRegius正确地回答了你的问题。如果答案满足您的问题,请记住接受!嘿,我已经更改了代码,所以当有行要删除时,我正在删除。在我的旧代码中,FirstOrDefault()并不好,因为一个人可以有许多声明。我已经更改了,但仍然得到相同的错误。ClaimID不包含值。