C#Entity Framework - 将数据插入子表时的Stack Overflow

时间:2015-11-29 13:01:04

标签: c# entity-framework stack-overflow

我是C#和Entity Framework的新手。我已经使用这些教程和StackOverflow来让我更好地理解。

  1. http://developer.telerik.com/featured/working-with-databases-through-visual-studio/
  2. https://msdn.microsoft.com/en-us/data/jj193542
  3. 使用Code-First方法,我创建了一个父表,并将数据插入表中没问题。当我让父表正常工作时,我添加了子表。我现在正在尝试将数据插入该子表。但是,我总是遇到堆栈溢出错误。我认为我的映射存在问题,但我不确定是什么。

    以下是我的代码。这是我定义数据库上下文和数据库对象的地方。

    public class DatabseContext : System.Data.Entity.DbContext
    {
        public DbSet<Parent> Parents { get; set; }
        public DbSet<Child> Children { get; set; }
    }
    
    public class Parent
    {
        private Guid parentIdVal;
    
        public Parent()
        {
            Children = new List<child>(); 
        }
    
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid parentId
        {
            get { return parentIdVal; }
            set { parentIdVal = Guid.NewGuid(); }
        }
    
        [Required]
        [StringLength(4)]
        public string parentData { get; set; }
    
        public virtual List<Child> Children { get; set; }
    }
    
    public class Child
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid childId
        {
            get { return childId; }
            set { childId = Guid.NewGuid(); }
        }
    
        [ForeignKey("Parent")]
        public Guid parentId { get; set; }
    
        [Required]
        [StringLength(65)]
        public string childData { get; set; }
    
        public virtual Parent Parent { get; set; }
    }
    

    我有一个不同的类,它解析文件并在每个表中插入行。这是代码:

        private static void addParentRecord(String source)
        {
            using (var db = new DatabaseContext())
            {
                Parent parent = new Parent(); 
                addDataToParent(parent); 
    
                createChildren(source, parent);
                db.Parents.Add(parent);
                db.SaveChanges();
            }
        }
    
        private static void createChildren(String source, Parent parent)
        {
            Regex regex = new Regex(pattern);
            foreach (Match match in regex.Matches(source))
            {
                Child child = new child();
                child.childData = match.Groups[group].Value; 
                parent.Children.Add(child); 
            }
        }
    

    因此代码会创建父表和子表。它创建父对象和子对象并填充对象。但是,当我去保存数据库更改时,它会不断调用get ChildId并且我得到堆栈溢出。某处有一些循环。我认为这是因为我没有正确设置父子映射。

    任何帮助,指针或链接将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

我明白了。我做了三件事。我重新编写了如何创建GUID,取出了DatabaseGenerated(DatabaseGeneratedOption.Identity)行,并确保ClassID方法与类名匹配,并在末尾添加了Id(没有额外的或缩写)。对于任何有同样问题的人,我的代码现在看起来像这样:

public class Parent
{
  public Parent()
  {
    Children = new List<child>(); 
    parentId = Guid.NewGuid(); 
  }

  [Key]
  public Guid parentId { get; set; }

  [Required]
  [StringLength(4)]
  public string parentData { get; set; }

  public virtual List<Child> Children { get; set; }
}

public class Child
{
  public Child()
  {
   childId = Guid.NewGuid();
  }

  [Key]
  public Guid childId { get; set; }

  [ForeignKey("Parent")]
  public Guid parentId { get; set; }

  [Required]
  [StringLength(65)]
  public string childData { get; set; }

  public virtual Parent Parent { get; set; }
}