C# 实体框架6.1检查是否未连接,然后连接崩溃
我正在尝试做一些事情,这里有一个“演示”,非常简单的例子。(这个演示没有任何意义,但它给出了我尝试做什么的一般概念) 我把我试过的东西注释掉了 有没有一种方法可以在不创建新上下文的情况下做到这一点 这是sql server上的第一个数据库 c#代码 SQL脚本C# 实体框架6.1检查是否未连接,然后连接崩溃,c#,entity-framework-6.1,C#,Entity Framework 6.1,我正在尝试做一些事情,这里有一个“演示”,非常简单的例子。(这个演示没有任何意义,但它给出了我尝试做什么的一般概念) 我把我试过的东西注释掉了 有没有一种方法可以在不创建新上下文的情况下做到这一点 这是sql server上的第一个数据库 c#代码 SQL脚本 USE [testing] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[LookupTable]( [LookupId] [int
USE [testing]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[LookupTable](
[LookupId] [int] NOT NULL,
CONSTRAINT [PK_LookupTable] PRIMARY KEY CLUSTERED
(
[LookupId] 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
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MainTable](
[MainId] [int] NOT NULL,
CONSTRAINT [PK_MainTable] PRIMARY KEY CLUSTERED
(
[MainId] 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
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MainTable_LookupTable](
[MainId] [int] NOT NULL,
[LookupId] [int] NOT NULL,
CONSTRAINT [PK_MainTable_LookupTable] PRIMARY KEY CLUSTERED
(
[MainId] ASC,
[LookupId] 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
INSERT [dbo].[LookupTable] ([LookupId]) VALUES (1)
GO
INSERT [dbo].[MainTable] ([MainId]) VALUES (10)
GO
INSERT [dbo].[MainTable_LookupTable] ([MainId], [LookupId]) VALUES (10, 1)
GO
ALTER TABLE [dbo].[MainTable_LookupTable] WITH CHECK ADD CONSTRAINT [FK_MainTable_LookupTable_LookupTable] FOREIGN KEY([LookupId])
REFERENCES [dbo].[LookupTable] ([LookupId])
GO
ALTER TABLE [dbo].[MainTable_LookupTable] CHECK CONSTRAINT [FK_MainTable_LookupTable_LookupTable]
GO
ALTER TABLE [dbo].[MainTable_LookupTable] WITH CHECK ADD CONSTRAINT [FK_MainTable_LookupTable_MainTable] FOREIGN KEY([MainId])
REFERENCES [dbo].[MainTable] ([MainId])
GO
ALTER TABLE [dbo].[MainTable_LookupTable] CHECK CONSTRAINT [FK_MainTable_LookupTable_MainTable]
GO
在我的例子中,解决方案是这个代码
for (var i = 1; i < 3; ++i)
{
lookup = db.LookupTables.Local.FirstOrDefault(x => x.LookupId == i);
if (lookup == null)
{
lookup = new edmx.LookupTable() { LookupId = i };
db.LookupTables.Attach(lookup);
}
main.LookupTables.Add(lookup);
}
for(变量i=1;i<3;++i)
{
lookup=db.LookupTables.Local.FirstOrDefault(x=>x.LookupId==i);
如果(查找==null)
{
lookup=new edmx.LookupTable(){LookupId=i};
db.LookupTables.Attach(查找);
}
main.LookupTables.Add(查找);
}
查找实例(id为1)仍然连接到EF,您正在调用的Remove只是删除main(10)和lookup(1)之间的链接
再次创建查找实例时,它在.NET中是另一个实例,但对于数据库/EF,它实际上是一个重复实例
您应该重新使用上一个查找实例,或者使用DbSet的属性再次查找它。谢谢,我使用您的建议用“解决方案”更新了我的问题,效果很好
for (var i = 1; i < 3; ++i)
{
lookup = db.LookupTables.Local.FirstOrDefault(x => x.LookupId == i);
if (lookup == null)
{
lookup = new edmx.LookupTable() { LookupId = i };
db.LookupTables.Attach(lookup);
}
main.LookupTables.Add(lookup);
}