2

У меня есть таблица с некоторыми отношениями, программа работает нормально, пока я не добавлю новое отношение между этой таблицей и таблицей customer, ddl для PermissionCode Таблица (первая таблица) как показано ниже:Entity Framework 6.1: данный ключ отсутствовал в словаре

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 

и DDL для моей customer таблицы, как показано ниже:

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 

Я использую Entityframework.bulkinsert плагин для насыпных кодов разрешения вставки для клиента. Если удалить FK_PermissionCode_Customer внешнего ключ программа работает без ошибок, и вставить коды разрешений успешно БД, но при добавлении этого Ф.К. отношениях Рамочной сущности выдайте эту ошибку:

at System.Collections.Generic.Dictionary 2.get_Item(TKey key) at EntityFramework.MappingAPI.Mappers.MapperBase.BindForeignKeys() in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappers\MapperBase.cs:line 603 at EntityFramework.MappingAPI.Mappings.DbMapping..ctor(DbContext context) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappings\DbMapping.cs:line 101 at EntityFramework.MappingAPI.EfMap.Get(DbContext context) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\EfMap.cs:line 60 at EntityFramework.MappingAPI.Extensions.MappingApiExtensions.Db(DbContext ctx, Type type) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Extensions\MappingApiExtensions.cs:line 51 at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector) at EntityFramework.BulkInsert.Helpers.MappedDataReader 1..ctor(IEnumerable 1 enumerable, IEfBulkInsertProvider provider) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Helpers\MappedDataReader.cs:line 58 at EntityFramework.BulkInsert.Providers.EfSqlBulkInsertProviderWithMappedDataReader.Run[T](IEnumerable 1 entities, SqlTransaction transaction, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\EfSqlBulkInsertProviderWithMappedDataReader.cs:line 22 at EntityFramework.BulkInsert.Providers.ProviderBase 2.Run[T](IEnumerable 1 entities, IDbTransaction transaction, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line 77 at EntityFramework.BulkInsert.Providers.ProviderBase 2.Run[T](IEnumerable 1 entities, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line 105 at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable 1 entities, SqlBulkCopyOptions sqlBulkCopyOptions, Nullable 1 batchSize) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line 95 at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable 1 entities, Nullable 1 batchSize) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line 75 at xxx.Domain.Repositories.PermissionCodeRepository.InsertRange(IList 1 permissionCodes) in xxx.Domain\Repositories\PermissionCodeRepository.cs:line 92 at xxx.Admin.Controllers.PermissionCodeController.Create(CreatePermissionCodeViewModel model) in xxx.WebUI.Admin\Controllers\PermissionCodeController.cs:line 169

Я не нашел проблему; для целей тестирования я сначала меняю свой db на первый подход к коду, и проблема решена. но я хочу теперь причину этой проблемы, это ошибка? или мне нужно сделать еще один шаг в дизайнере модели сущностей?

+0

@Gert Arnold: ошибка указана в заголовке, не более, чем эта строка: «Указанный ключ отсутствовал в словаре." –

ответ

1

Это ошибка. Это произошло потому, что вы переименовали свои pocos и/или dbsetnames.

Повторите попытку dbfirst без переименования, и вы обязательно наполните его!

+0

Не могли бы вы объяснить больше? Что вы имеете в виду от renaiming pocos, я полностью удаляю edmx-файл и воссоздаю его, но все еще не работаю –

+0

Массовое использование EntityFramework.MappingAPI для сопоставления pocos. Оно использует метод SSPace для извлечения имен таблиц в вашем метаданных http://blog.cincura.net/230583-metadataworkspace-in-entity-framework/). Проблема заключается в том, что MappingApi не нашел таблицу в метаданных, но не запускает какую-либо ошибку. Поэтому она прерывается в bindforeignkeys beacause у него нет внешних ключей => у него нет таблицы. Если это не ваша проблема, попробуйте отладить dll;) –

+0

Я не переименовал ничего - что могло бы послужить причиной этой проблемы? делаю это нормально (но медленно!) – PeterX

1

Это случилось со мной в следующей ситуации:

  • DB первый
  • не вручную переименованы объекты после обновления модели из базы данных.
  • таблица называется Пользователями
  • «или множественного число сгенерированных имен образовывать форму единственного числа объекта» включен

Я решил его переименование таблицы пользователя.

NB: Я вырыл немного с .Net Reflector, чтобы получить к решению, и я полагаю, что EntityFramework.MappingAPI пытается найти таблицу пользователя, потому что РоКо называется пользователя, хотя Didn» Когда я его исправил, я еще не разобрался.

0

Для меня ошибка была вызвана атрибутом столбца, используемым для случайного объекта. Например .:

[Колонка ("LANGUAGENAME")]

общественная строка Name {получить; задавать; }

Это явно ошибка в сопоставлении столбцов BulkInsert.

В качестве примечания стороны: разработчик, который не проверял ключ в этом словаре, должен чувствовать себя плохо. Он потратил много времени на нас.

Счастливые девочки.

+2

Да, объемная вставка - пустая трата времени ... –

Смежные вопросы