C# 用一个SaveChanges()命令从头开始填充整个数据库(使用M:M关系)

C# 用一个SaveChanges()命令从头开始填充整个数据库(使用M:M关系),c#,entity-framework,C#,Entity Framework,我的数据库是空的,在我的C#应用程序中,我需要填充它并只使用一个.SaveChanges()命令-要么保存所有内容,要么什么也不保存 我遇到的问题是: 我有三张桌子:个人,班级,个人班级。那些是空的 因此,在C#代码中,通过实体模型,我添加了一个人{Id:1,Name:John}。 接下来,我想在John和某个类之间添加一个关系,然后我想添加该类。因此,在我创建John之后,我会这样做: John.Classes.Add(new Class {

我的数据库是空的,在我的C#应用程序中,我需要填充它并只使用一个.SaveChanges()命令-要么保存所有内容,要么什么也不保存

我遇到的问题是:

我有三张桌子:个人,班级,个人班级。那些是空的

因此,在C#代码中,通过实体模型,我添加了一个人{Id:1,Name:John}。 接下来,我想在John和某个类之间添加一个关系,然后我想添加该类。因此,在我创建John之后,我会这样做:

John.Classes.Add(new Class
                        {
                            ClassId = 1
                        });
然后我把数学加入数据库

然后我SaveChanges(),我得到了主键约束的冲突:不能插入重复键

在PersonClass表中,我有两列—personId和classId。它们都是主键,并且不是自动递增的属性


Person有两列:id和Name。类只有一个列id。id是主键,但不是自动插入的。

如果要强制执行“要么保存所有内容,要么什么都不保存”,则无需坚持“仅保存一次更改”,您应该将其拆分为多个保存,但将其包装在同一事务中,并仅在最后提交该事务

这样做的好处是,如果它失败了,您就可以更好地了解它失败的地方(而不是在最后做这件事,并且需要深入挖掘异常以获得一个神秘的错误)


例如在EF6或更高版本中:

需要查看个人和类的模型定义。@KeithPayne我在问题中添加了这个。请看。EF模型对于解决这一问题非常重要。这些表是模型的产物。我的意思是,你可能是本末倒置,把注意力集中在桌子上。例如,在EF中,不定义m:m关系的外部参照表。EF会为你做这件事。如果您在EF中工作正常,那么它还负责在调用
SaveChanges()
时分配外键值。有了发布的模型代码,我可以更具体一些。很好的建议,但没有解决这个问题。也许这是一个更好的评论。它确实解决了这个问题,这个问题是关于将它全部保存在一组savechanges中,它没有解释为什么他有一个异常,但没有人能回答这个问题(我将编辑以回答这个问题),直到他回答了你的问题,没有模型,没有好的答案。但这肯定是答案的一部分,而不仅仅是一个评论,因为他的问题也是对拯救的“全有或全无”性质的一个明显误解。@RonanThibaudau我该怎么做?@petko_stankoski如果你使用EF6或更高版本,你可以在那里查看一个很好的开始文档:@RonanThibaudau Nope,我使用的是EF5。