Sql server 实体框架6.1:字典中不存在给定的键

Sql server 实体框架6.1:字典中不存在给定的键,sql-server,asp.net-mvc,entity-framework,entity-framework-6,ef-database-first,Sql Server,Asp.net Mvc,Entity Framework,Entity Framework 6,Ef Database First,我有一个带有一些关系的表,程序运行良好,直到我在该表和customer表之间添加了一个新的关系,PermissionCode表(第一个表)的ddl如下所示: CREATE TABLE [dbo].[PermissionCode] ( [Id] int NOT NULL IDENTITY(1,1) , [Salt] varchar(3) COLLATE Turkish_CI_AS NOT NULL , [Code] nvarchar(12) COLLATE Turkish_CI_AS NOT NU

我有一个带有一些关系的表,程序运行良好,直到我在该表和
customer
表之间添加了一个新的关系,
PermissionCode
表(第一个表)的ddl如下所示:

CREATE TABLE [dbo].[PermissionCode] (
[Id] int NOT NULL IDENTITY(1,1) ,
[Salt] varchar(3) COLLATE Turkish_CI_AS NOT NULL ,
[Code] nvarchar(12) COLLATE Turkish_CI_AS NOT NULL ,
[StartDate] date NULL ,
[EndDate] date NULL ,
[TypeId] int NOT NULL ,
[UserId] nvarchar(128) COLLATE Turkish_CI_AS NULL ,
[OwnerId] int NULL ,
[CategoryId] int NULL ,
[IsActive] bit NOT NULL DEFAULT ((1)) ,
[InsertIdentifier] varchar(8) COLLATE Turkish_CI_AS NULL ,
[IsForTeacher] bit NOT NULL DEFAULT ((0)) ,
CONSTRAINT [PK__Table__3214EC0759063A47] PRIMARY KEY ([Id]),
CONSTRAINT [FK_PermissionCode_Category] FOREIGN KEY ([CategoryId]) REFERENCES [dbo].[Category] ([Id]) ON DELETE SET NULL ON UPDATE NO ACTION,
CONSTRAINT [FK_PermissionCode_Customer] FOREIGN KEY ([OwnerId]) REFERENCES [dbo].[Customers] ([Id]) ON DELETE SET NULL ON UPDATE NO ACTION,
CONSTRAINT [FK_PermissionCode_PremissionCodeType] FOREIGN KEY ([TypeId]) REFERENCES [dbo].[Category] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [FK_PermissionCode_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [UQ__Permissi__DB7779646E01572D] UNIQUE ([Salt] ASC, [Code] ASC)
)
ON [PRIMARY]
GO   

CREATE INDEX [IX_PermissionCode_Code ] ON [dbo].[PermissionCode]
([Code] ASC) 
ON [PRIMARY]
GO
CREATE TABLE [dbo].[Customers] (
[Id] int NOT NULL IDENTITY(1,1) ,
[UserId] nvarchar(128) COLLATE Turkish_CI_AS NOT NULL ,
[OfficeName] nvarchar(200) COLLATE Turkish_CI_AS NULL ,
[CityId] int NULL ,
[StateId] int NULL ,
[Address] nvarchar(1000) COLLATE Turkish_CI_AS NULL ,
[Tel1] nvarchar(20) COLLATE Turkish_CI_AS NULL ,
[Tel2] nvarchar(20) COLLATE Turkish_CI_AS NULL ,
[Fax] nvarchar(20) COLLATE Turkish_CI_AS NULL ,
[ResponsiblePersonFirstName] nvarchar(50) COLLATE Turkish_CI_AS NULL ,
[ResponsiblePersonLastName] nvarchar(100) COLLATE Turkish_CI_AS NULL ,
[Deleted] bit NOT NULL DEFAULT ((0)) ,
[CustomerType] varchar(10) COLLATE Turkish_CI_AS NOT NULL ,
CONSTRAINT [PK__Customer__3214EC07345EC57D] PRIMARY KEY ([Id]),
CONSTRAINT [FK_Customers_City] FOREIGN KEY ([CityId]) REFERENCES [dbo].[City] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [FK_Customers_State] FOREIGN KEY ([StateId]) REFERENCES [dbo].[State] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [FK_Customers_Users] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE ON UPDATE CASCADE
)
ON [PRIMARY]
GO
我的
客户
表的ddl如下所示:

CREATE TABLE [dbo].[PermissionCode] (
[Id] int NOT NULL IDENTITY(1,1) ,
[Salt] varchar(3) COLLATE Turkish_CI_AS NOT NULL ,
[Code] nvarchar(12) COLLATE Turkish_CI_AS NOT NULL ,
[StartDate] date NULL ,
[EndDate] date NULL ,
[TypeId] int NOT NULL ,
[UserId] nvarchar(128) COLLATE Turkish_CI_AS NULL ,
[OwnerId] int NULL ,
[CategoryId] int NULL ,
[IsActive] bit NOT NULL DEFAULT ((1)) ,
[InsertIdentifier] varchar(8) COLLATE Turkish_CI_AS NULL ,
[IsForTeacher] bit NOT NULL DEFAULT ((0)) ,
CONSTRAINT [PK__Table__3214EC0759063A47] PRIMARY KEY ([Id]),
CONSTRAINT [FK_PermissionCode_Category] FOREIGN KEY ([CategoryId]) REFERENCES [dbo].[Category] ([Id]) ON DELETE SET NULL ON UPDATE NO ACTION,
CONSTRAINT [FK_PermissionCode_Customer] FOREIGN KEY ([OwnerId]) REFERENCES [dbo].[Customers] ([Id]) ON DELETE SET NULL ON UPDATE NO ACTION,
CONSTRAINT [FK_PermissionCode_PremissionCodeType] FOREIGN KEY ([TypeId]) REFERENCES [dbo].[Category] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [FK_PermissionCode_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [UQ__Permissi__DB7779646E01572D] UNIQUE ([Salt] ASC, [Code] ASC)
)
ON [PRIMARY]
GO   

CREATE INDEX [IX_PermissionCode_Code ] ON [dbo].[PermissionCode]
([Code] ASC) 
ON [PRIMARY]
GO
CREATE TABLE [dbo].[Customers] (
[Id] int NOT NULL IDENTITY(1,1) ,
[UserId] nvarchar(128) COLLATE Turkish_CI_AS NOT NULL ,
[OfficeName] nvarchar(200) COLLATE Turkish_CI_AS NULL ,
[CityId] int NULL ,
[StateId] int NULL ,
[Address] nvarchar(1000) COLLATE Turkish_CI_AS NULL ,
[Tel1] nvarchar(20) COLLATE Turkish_CI_AS NULL ,
[Tel2] nvarchar(20) COLLATE Turkish_CI_AS NULL ,
[Fax] nvarchar(20) COLLATE Turkish_CI_AS NULL ,
[ResponsiblePersonFirstName] nvarchar(50) COLLATE Turkish_CI_AS NULL ,
[ResponsiblePersonLastName] nvarchar(100) COLLATE Turkish_CI_AS NULL ,
[Deleted] bit NOT NULL DEFAULT ((0)) ,
[CustomerType] varchar(10) COLLATE Turkish_CI_AS NOT NULL ,
CONSTRAINT [PK__Customer__3214EC07345EC57D] PRIMARY KEY ([Id]),
CONSTRAINT [FK_Customers_City] FOREIGN KEY ([CityId]) REFERENCES [dbo].[City] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [FK_Customers_State] FOREIGN KEY ([StateId]) REFERENCES [dbo].[State] ([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT [FK_Customers_Users] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE ON UPDATE CASCADE
)
ON [PRIMARY]
GO
我使用插件为客户批量插入权限代码。如果我删除了
FK\u PermissionCode\u Customer
外键,程序运行时不会出错,并成功地将权限代码插入数据库,但添加此FK关系实体框架时会出现以下错误:

在System.Collections.Generic.Dictionary
2.get_项(TKey)
在c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappers\MapperBase.cs中的EntityFramework.MappingAPI.Mappers.MapperBase.BindForeignKeys()处:第603行
在c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\MappingAPI\MappingAPI\Mappings\DbMapping.cs中的EntityFramework.Mappings.DbMapping..ctor(DbContext上下文)处:第101行
在c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\EfMap.cs中的EntityFramework.MappingAPI.EfMap.Get(DbContext上下文)处:第60行
在c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Extensions\MappingApiExtensions.Db(DbContext ctx,Type Type)中的EntityFramework.MappingAPI.Extensions.MappingAPI\Extensions\MappingApiExtensions.cs:第51行
在System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1源,Func
2键选择器,Func
2元素选择器,IEqualityComparer
1比较器)
在System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1源,Func
2键选择器,Func
2元素选择器) 在c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Helpers.MappedDataReader
1..ctor(IEnumerable
1 enumerable,IEfBulkInsertProvider provider)中的EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Helpers\MappedDataReader.cs:第58行 在c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\efsqlbulkinsertproviders WithMappedDataReader.Run[T](IEnumerable
1实体、SqlTransaction事务、BulkInsertOptions选项)中的EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\EfSqlBulkInsertProviderWithMappedDataReader.cs:第22行
在EntityFramework.BulkInsert.Providers.ProviderBase中运行[T](IEnumerable
1实体,IDbTransaction事务,BulkInsertOptions选项),位于c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:第77行
在EntityFramework.BulkInsert.Providers.ProviderBase中运行[T](IEnumerable
1实体,BulkInsertOptions选项),位于c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:第105行
在c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsert\Extensions\BulkInsertExtension.cs第95行的EntityFramework.BulkInsert.Extensions
在c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsert\Extensions\BulkInsertExtension.cs中的EntityFramework.BulkInsertExtension.BulkInsert[T](DbContext,IEnumerable
1个实体,Nullable
1个batchSize):第75行
位于xxx.Domain\Repositories\PermissionCodeRepository.cs中的xxx.Domain.Repositories.PermissionCodeRepository.InsertRange(IList
1 permissionCodes)处:第92行 位于xxx.WebUI.Admin\Controllers\PermissionCodeController.cs中的xxx.Admin.Controllers.PermissionCodeController.Create(CreatePermissionCodeViewModel模型):第169行


我找不到问题;出于测试目的,我将db-first更改为代码优先的方法,并解决了问题。但是我现在想知道这个问题的原因,这是一个bug吗?还是我需要在实体框架模型设计器中再做一步?

这是一个bug。这是因为您重命名了POCO和/或DBSetName


在不重命名的情况下重试dbfirst,您肯定会将其批量处理

这发生在我身上的情况如下:

  • DB优先
  • 从数据库更新模型后,没有手动重命名的实体
  • 名为“用户”的表
  • 启用“生成的对象名称的复数化或单数化”
我通过将表重命名为User解决了这个问题


注意:我使用.Net Reflector进行了一些挖掘,以获得一个解决方案,我假设EntityFramework.MappingAPI正在尝试查找表User,因为POCO被称为User,但在修复后没有进一步挖掘。

对于我来说,错误是由随机实体上使用的列属性引起的。例如:

[列(“LanguageName”)]

公共字符串名称{get;set;}

这显然是BulkInsert列映射中的一个错误

顺便说一句:没有检查字典中的键的开发人员应该会感觉很糟糕。他为我们浪费了很多时间


祝您编码愉快。

您能再解释一下吗?我完全删除了edmx文件,并重新创建了它,但仍然不是workBulk使用EntityFramework.MappingAPI映射pocos。它使用SSPace方法在metadataworkspace()中检索表名。问题是MappingApi在metadataworkspace中找不到该表,但没有启动任何错误。因此它在bindingforeignkeys中中断,因为它没有任何外键=>它没有该表。如果这不是您的问题,请尝试调试dll;)我没有重命名任何东西-这个问题的原因是什么?它正常工作(但速度很慢!)。我先运行DB,还没有重命名任何东西。但我还是不能跑。这是我的问题:如果有任何帮助,我将不胜感激,因为
AddRange
非常慢。@Gert Arnold:给出了错误