计算实体框架(EF)事务中添加的父项数

时间:2016-02-25 19:01:35

标签: c# entity-framework linq entity-framework-6

我正在使用.NET Entity Framework 6(EF6)将父/子数据加载到数据库中。

CVE是一个“父”实体,它有多个与之关联的子项(例如“引用”和“CVSS分数”)。一旦我的上下文加载了我要保存的所有ojbects(CVE及其相关的子项),我调用“SaveChanges”然后想知道有多少父实体(CVE)插入到数据库中。

不幸的是,“SaveChanges”方法返回添加的对象总数。我只想知道添加的CVE(父对象)的数量。

这是我的代码;

internal static int LoadCVEs(IEnumerable<CVE> cves)
        {
            using (var context = new NVDEntities())
            {
                try
                {
                    foreach(var cve in cves)
                    {
                        var existingCVE = context.CVEs.Find(cve.CveID);

                        //Check if CVE already exists.
                        if (existingCVE != null)
                        {
                            //Check to see if this record was recently modified. If so, then replace the entire record with the latest one.
                                if (DateTimeOffset.Compare(cve.ModifiedDate.Value, existingCVE.ModifiedDate.Value) > 0)
                                {
                                    //CVE has been recently modified. Replace the outdated record.
                                    context.CVEs.Remove(existingCVE);
                                    context.CVEs.Add(cve);
                                }
                        }
                        else
                        {
                            //CVE is new. Insert it.
                            context.CVEs.Add(cve);
                        }
                    }

                    context.SaveChanges();
                }
    }

除此之外,我尝试了以下内容;

context.CVEs.Where(c => context.Entry(c).State == EntityState.Added).Count()

但是返回以下错误;

  

发生了类型为“System.NotSupportedException”的未处理异常   在EntityFramework.SqlServer.dll

中      

其他信息:LINQ to Entities无法识别该方法   “System.Data.Entity.Infrastructure.DbEntityEntry`1 [NVDImport.Models.CVE]   EntryCVE'的方法,这种方法不可能   翻译成商店表达。

如何获得已添加的CVE(父对象)总数?

1 个答案:

答案 0 :(得分:1)

也许是这样的?

在DbContext继承类中,您想要覆盖SaveChanges()方法:

    public override int SaveChanges()
    {

        int cveCount = ChangeTracker.Entries<CVE>().Where(argEntry => argEntry.State == EntityState.Added).Count();

        base.SaveChanges();

        return cveCount;
    }