我是C#和Entity Framework的新手。我已经使用这些教程和StackOverflow来让我更好地理解。
使用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并且我得到堆栈溢出。某处有一些循环。我认为这是因为我没有正确设置父子映射。
任何帮助,指针或链接将不胜感激。谢谢。
答案 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; }
}