【问题标题】:How to avoid creating a parent when adding a child record in Entity Framework?在实体框架中添加子记录时如何避免创建父项?
【发布时间】:2014-10-21 14:31:05
【问题描述】:

数据库中有 2 个表,一个是 [PARENTS],另一个是 [CHILDREN] - 以 ParentId 作为外键。

所以父母和孩子之间的关系是一对多的。

问题是当我试图创建一个新的 CHILDREN 记录时,它也会创建一个新的 PARENT。

如何解决?谢谢

  public void Add(Model.Pages.PageGroup entity)
        {
            using (var ctx = new SmartDbContext())
            {
                var dbEntity = entity.ToEntity();
                ctx.PageGroups.Add(dbEntity);
                ctx.SaveChanges();
            }
        }

    namespace SmartECM.Repository.EF
    {
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    public partial class PageGroup
    {
        public PageGroup()
        {
            Pages = new HashSet<Page>();
        }

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid GroupId { get; set; }

        [Required]
        [StringLength(100)]
        public string GroupName { get; set; }

        public Guid ProjectId { get; set; }

        [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]
        public DateTime? DateAdded { get; set; }
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]
        public DateTime? DateUpdated { get; set; }

        public virtual Project Project { get; set; }

        public virtual ICollection<Page> Pages { get; set; }
    }
}


    namespace SmartECM.Repository.EF
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    public partial class Project
    {
        public Project()
        {
            PageGroups = new HashSet<PageGroup>();
        }

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ProjectId { get; set; }

        [Required]
        [StringLength(100)]
        public string ProjectName { get; set; }

        public string ProjectDescription { get; set; }

        public Guid? Owner { get; set; }

        [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]
        public DateTime? DateAdded { get; set; }

        [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]
        public DateTime? DateUpdated { get; set; }

        public virtual ICollection<PageGroup> PageGroups { get; set; }
    }
}

【问题讨论】:

  • 您能否显示填充该实体字段的代码?我想我知道出了什么问题,但在我看到那个代码之前我不能确定。
  • @IronMan84 是的,先生。更新。请立即查看。
  • Pages 类在哪里?
  • 你的意思是当你添加一个PageGroup时,它也添加了一个Project?即使Project 已经存在,还是您根本不想要Project
  • 我不是指实体代码类(尽管这些也很有帮助!)。我的意思是在调用 Add 方法之前将数据放入该实体的位置。

标签: c# entity-framework entity-framework-4


【解决方案1】:

谢谢大家!!!

我从这个链接Entity Framework - Duplicate parent(one) when create new child(many)得到了正确答案

我猜它应该附加父级以让 EF 可以检测到它。

【讨论】:

    【解决方案2】:

    根据您迄今为止发布的内容,我认为您的问题来自您在相关实体上设置值的位置(即在您调用 Add() 方法之前)。我认为您正在做的是在您的 PageGroup 实体上设置 Project 导航属性,然后尝试像那样保存它。

    这样做的问题在于,当您将 PageGroup 实体添加到集合时,EF 发现 ProjectId 字段为空,并假定在 Project 导航属性中找到的数据是全新的当前不在系统中的项目。然后它将继续并在数据库中创建该“新”项目,以便将您的 PageGroup 实体添加到其集合中。

    然后解决方案是使用您尝试关联的项目的 ID 填充 ProjectId 字段,而不为导航属性分配任何内容。这样 EF 就会知道您尝试将实体分配到哪个项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2021-02-19
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多