实体框架保存了太多子实体

德雷沃克

我正在一个项目,该项目包含多个要保存到数据库中的对象。我使用单个上下文和一系列存储库类来访问它们。

当我尝试保存一个实体时,似乎已经保存了与之关联的所有虚拟实体,即使该实体已经存在于数据库中。

这些是我的课程:

public class Requirement
{
    public int ID { get; set; }
    public DateTime DateDue { get; set; }
    public DateTime DateCompleted { get; set; }

    public virtual Standard Standard { get; set; }
    public virtual Project Project { get; set; }
}

public class Standard
{
    public int ID { get; set; }
    public int AgencyID { get; set; }
    public string Name { get; set; }

    public virtual Agency Agency { get; set; }
}


public class Project
{
    public int ID { get; set; }
    public bool Active { get; set; }

    public virtual Agency Agency { get; set; }
    public virtual Department Department { get; set; }
}

这是我创建一些数据的方法:

public class RequirementRepository
{
    public static string CreateMockData()
    {
        StandardRepository stdRep = new StandardRepository();
        ProjectRepository projRep = new ProjectRepository();
        RequirementRepository reqRep = new RequirementRepository();
        Project project = projRep.Find(1);
        StringBuilder sb = new StringBuilder()
        foreach (Standard s in stdRep.FindByAgencyID(project.Agency.ID))
        {
            Requirement r = new Requirement();
            r.Project = project;
            r.Standard = s;
            r.DateCompleted = (DateTime)SqlDateTime.MaxValue;
            r.DateDue = DateTime.Now.AddDays(90);

            r = reqRep.Save(r);

            sb.AppendLine(String.Format("Saved Requirement ID {0} with Project ID {1}<br>", r.ID, r.Project.ID));
        }

        return sb.ToString();
    }
}

这是关联的存储库代码:

public class ProjectRepository
{
    public Project Find(int id)
    {
        using (var db = new MyContext())
        {
            return db.Projects
                .Include(p => p.Agency)
                .Include(p => p.Department)
                .First(p => p.ID.Equals(id));
        }
    }
}


public class StandardRepository
{
    public List<Standard> FindByAgencyID(int agencyID)
    {
        using (var db = new MyContext())
        {
            return db.Standards.Where(r => r.AgencyID == agencyID).ToList();
        }
    }
}



public class RequirementRepository
{
    public Requirement Save(Requirement requirement)
    {
        using (var db = new MyContext())
        {
            Requirement retVal = requirement;
            if (requirement.ID.Equals(0))
            {
                retVal = db.Requirements.Add(requirement);
            }
            else
            {
                db.Entry(requirement).State = EntityState.Modified;
            }

            db.SaveChanges();
            return retVal;
        }
    }
}

当我运行此方法时,我希望它可以将许多新的Requirements插入到数据库中,项目ID为1,标准ID为所采用的任何标准。相反,它为添加的每个需求创建一个全新的项目和全新的标准,然后将这些ID分配给需求。

米克

每个上下文都跟踪加载,修改和添加的实体。

您的存储库需要看起来像这样。

public class StandardRepository
{
    MyContext _context;

    public StandardRepository(MyContext context)
    {
        _context = context;
    }

    public List<Standard> FindByAgencyID(int agencyID)
    {
        return _context.Standards.Where(r => r.AgencyID == agencyID).ToList();
    }
}

public class RequirementRepository
{
    MyContext _context;

    public RequirementRepository(MyContext context)
    {
        _context = context;
    }

    public Requirement Save(Requirement requirement)
    {
    Requirement retVal = requirement;
    if (requirement.ID.Equals(0))
    {
        retVal = _context.Requirements.Add(requirement);
    }
    else
    {
        _context.Entry(requirement).State = EntityState.Modified;
    }

    _context.SaveChanges();
    return retVal;
    }
}

public class RequirementRepository
{
    public static string CreateMockData()
    {
        using(MyContext context = new MyContext())
        {
                StandardRepository stdRep = new StandardRepository(context);
                ProjectRepository projRep = new ProjectRepository(context);
                RequirementRepository reqRep = new RequirementRepository(context);
                Project project = projRep.Find(1);
                StringBuilder sb = new StringBuilder()
                foreach (Standard s in stdRep.FindByAgencyID(project.Agency.ID))
                {
                Requirement r = new Requirement();
                r.Project = project;
                r.Standard = s;
                r.DateCompleted = (DateTime)SqlDateTime.MaxValue;
                r.DateDue = DateTime.Now.AddDays(90);

                r = reqRep.Save(r);

                sb.AppendLine(String.Format("Saved Requirement ID {0} with Project ID {1}<br>", r.ID, r.Project.ID));
            }
        }
        return sb.ToString();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用实体框架保存大型实体和子实体

来自分类Dev

使用实体框架保存大型实体和子实体

来自分类Dev

用子实体保存实体

来自分类Dev

休眠:保存子实体

来自分类Dev

实体框架ApplicationUser子实体返回null

来自分类Dev

实体框架LINQ包含-子实体

来自分类Dev

实体框架添加所有子实体

来自分类Dev

实体框架未正确加载子实体

来自分类Dev

实体框架查询以包括实体集合的子实体

来自分类Dev

无法急于加载实体框架子实体

来自分类Dev

实体框架6-如何添加子实体?

来自分类Dev

如何从子实体数据获取父实体框架核心?

来自分类Dev

实体框架6错误-ICollection不包含子实体的定义

来自分类Dev

实体框架无需询问即可填充子实体

来自分类Dev

在实体框架6中删除子实体时出错

来自分类Dev

实体框架子实体的唯一属性

来自分类Dev

保存父实体时,不会保存新的子实体

来自分类Dev

实体框架保存更改

来自分类Dev

NHibernate-无法保存子实体

来自分类Dev

实体框架应用了太多的迁移

来自分类Dev

通过实体框架保存显式实体

来自分类Dev

实体框架从具有子实体的父实体中提取简单列表

来自分类Dev

C#实体框架:插入子实体并更新父实体,一次事务

来自分类Dev

实体框架7保存更改

来自分类Dev

实体框架未保存数据

来自分类Dev

Hibernate保存具有空父ID的子实体

来自分类Dev

保存 Hibernate JPA 子实体的正确方法是什么

来自分类Dev

正确的方法用于插入子实体的实体框架主从细节插入记录代码

来自分类Dev

实体框架-有效删除所有子实体而无需加载它们