如何在Entity Framework中添加子记录时避免创建父级?

时间:2014-10-21 14:31:05

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

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

所以父母和孩子之间的关系只有一个。

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

如何解决?谢谢

enter image description here

  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; }
    }
}

2 个答案:

答案 0 :(得分:3)

谢谢大家!!!

我从这个链接Entity Framework - Duplicate parent(one) when create new child(many)

得到了正确的答案

我想它应该附加父母让EF可以检测到它。

enter image description here

答案 1 :(得分:2)

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

这样做的问题是,当您将PageGroup实体添加到集合时,EF会看到ProjectId字段为空,并假设Project中找到的数据navigation属性是一个全新的项目,目前不在系统中。然后它将继续前进并创造出新的&#34;数据库中的项目,以便将PageGroup实体添加到其集合中。

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