Entity framework 向EF中的数据库集添加记录的顺序是否会引起外键冲突?

Entity framework 向EF中的数据库集添加记录的顺序是否会引起外键冲突?,entity-framework,ef-database-first,Entity Framework,Ef Database First,首先使用EF数据库时,我无法将记录插入到特定的表中。我得到的INSERT语句与外键冲突…错误 我的问题: 假设EF要求您在更改过程结束时只执行一次dbContext.SaveChanges(),那么您向dbset添加记录的顺序是否会影响这一点?或者这并不重要,因为DbContext跟踪对数据所做的所有更改,并负责按正确的顺序应用这些更改 举例来说,对于3个表A、B和C,其中B在A上有一个FK,C在B上有一个FK,如果我手动循环所有记录,我必须添加到C、B和A-并且在发出DbSet.add()之前

首先使用EF数据库时,我无法将记录插入到特定的表中。我得到的
INSERT语句与外键冲突…
错误

我的问题:

假设EF要求您在更改过程结束时只执行一次
dbContext.SaveChanges()
,那么您向
dbset
添加记录的顺序是否会影响这一点?或者这并不重要,因为
DbContext
跟踪对数据所做的所有更改,并负责按正确的顺序应用这些更改

举例来说,对于3个表A、B和C,其中B在A上有一个FK,C在B上有一个FK,如果我手动循环所有记录,我必须添加到C、B和A-并且在发出
DbSet.add()
之前执行
DbSet.add()
有问题吗? 是否需要为每个表添加发出
dbContext.SaveChanges()

为所有3个表添加创建sql脚本:

CREATE TABLE [dbo].[A](
    [Id] [int] NOT NULL,
    [a1] [int] IDENTITY(1,1) NOT NULL,
    [a2] [nvarchar](50) NULL,
 CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [IX_A] UNIQUE NONCLUSTERED 
(
    [a1] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



CREATE TABLE [dbo].[B](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [a1] [int] NULL,
    [b1] [int] NULL,
    [b2] [nvarchar](50) NULL,
 CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [IX_B] UNIQUE NONCLUSTERED 
(
    [b1] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[B]  WITH CHECK ADD  CONSTRAINT [FK_B_A1] FOREIGN KEY([a1])
REFERENCES [dbo].[A] ([a1])
GO

ALTER TABLE [dbo].[B] CHECK CONSTRAINT [FK_B_A1]
GO


CREATE TABLE [dbo].[C](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [b1] [int] NULL,
    [c1] [int] NULL,
    [c2] [nvarchar](50) NULL,
 CONSTRAINT [PK_C] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[C]  WITH CHECK ADD  CONSTRAINT [FK_C_B] FOREIGN KEY([b1])
REFERENCES [dbo].[B] ([b1])
GO

ALTER TABLE [dbo].[C] CHECK CONSTRAINT [FK_C_B]
GO
我知道上面提到的错误是什么意思,但我还无法找到哪些数据链接错误/不一致

顺便问一下,
GetValidationErrors()
中为什么没有“捕获”此类错误(
INSERT语句与外键冲突…


更新

问题一定是我试图填充表的方式。但这应该怎么做呢

对于以下场景:

这些表应该如何填充?我的两次DbSet.Add()尝试都以失败告终

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_B_A1". The conflict occurred in database "Test", table "dbo.A", column 'a1'.
The statement has been terminated.

不,顺序不重要。这里的问题是,您似乎有外键,但缺少导航属性,并且从未设置实体之间的关系

因此,当保持
B
时,它不会指向任何有效的
A
。正确的代码应该看起来像

A a = new A() { ....
B b = new B() { a = a, ...

假设您从B到A的导航属性被称为
A

A.a1
键属性?该错误意味着您正在将某个外键列设置为一个在关联表中没有匹配记录的值。a.a1没有映射到a的键,因为a的键是Id。
在关联表中没有匹配记录
-我知道。噢,您正在尝试将非键列用作外键。我认为EF不支持这一点。这就是问题所在,我打开了一个。使用EF,模型中的键列不一定必须与数据库中具有主键约束的列相同,尽管我不确定首先如何使用数据库配置。你也许可以利用这个优势(特别是如果主键没有在其他地方用作外键引用的话)。您好,Wiktor,谢谢您的回复。这意味着必须手动实现这些关系。我的意思是,我必须以编程方式设置导航属性?这是不清楚的。我的问题是弄清楚为什么创建表时没有导航属性。我把这个贴成了。这个外键到底是什么?涉及哪个栏目?您能发布它的确切定义而不是数据库关系图吗?根据您的请求进行更新。@Veverke:我不确定EF是否支持非主键列的导航属性。您确定这是受支持的吗?这似乎是一个证据,但事实并非如此。
A a = new A() { ....
B b = new B() { a = a, ...