C# Entity Framework - 将数据插入 child table 时发生堆栈溢出

C# Entity Framework - Stack Overflow when inserting data into child table

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

  1. http://developer.telerik.com/featured/working-with-databases-through-visual-studio/
  2. https://msdn.microsoft.com/en-us/data/jj193542

使用 Code-First 方法,我创建了一个 parent table 并将数据插入到 table 没问题。当 parent table 正常工作时,我添加了 child table。我现在正在尝试将数据插入 child table。但是,我总是遇到堆栈溢出错误。我认为我的映射有问题,但我不确定是什么。

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

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

我有一个不同的 class 解析文件并将行插入每个 table。这是代码:

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

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

任何帮助、指示或链接将不胜感激。谢谢。

我明白了。我做了三件事。我重新创建了 GUID,删除了 DatabaseGenerated(DatabaseGeneratedOption.Identity) 行,并确保 ClassID 方法与 class 名称匹配,并在末尾添加了一个 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; }
}