Entity Framework 6.1: la key donnée n'était pas présente dans le dictionary

J'ai une table avec quelques relations, le programme fonctionne bien jusqu'à ce que j'ajoute une nouvelle relation entre cette table et customer table de customer , le ddl pour la table PermissionCode (première table) est comme ci-dessous:

 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 

et le ddl pour ma table de customer est comme ci-dessous:

 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 

J'utilise le plugin Entityframework.bulkinsert pour insert en bloc des codes d'autorisation pour un client. Si je supprime la key étrangère FK_PermissionCode_Customer le programme s'exécute sans erreur, et insère les codes d'autorisation avec succès dans db, mais lorsque j'ajoute cette structure d'entité de relation fk, j'écris cette erreur:

à 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 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector) à EntityFramework.BulkInsert.Helpers.MappedDataReader 1..ctor(IEnumerable 1 enumerable, fournisseur IEfBulkInsertProvider) dans c: \ dev \ EntityFramework.BulkInsert \ dev \ Src \ EntityFramework.BulkInsert \ Helpers \ MappedDataReader.cs: ligne 58 à EntityFramework.BulkInsert.Providers.EfSqlBulkInsertProviderWithMappedDataReader.Run [T] ( 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 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] ( 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 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] ( 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 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, 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 entités 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, 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 entités 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, 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) dans xxx.Domain \ Repositories \ PermissionCodeRepository.cs: ligne 92 à xxx.Admin. Controllers.PermissionCodeController.Create (model CreatePermissionCodeViewModel) dans xxx.WebUI.Admin \ Controllers \ PermissionCodeController.cs: ligne 169

Je ne peux pas find le problème; à des fins de test, je change d'abord ma database pour coder la première approche et résoudre le problème. mais je veux maintenant la raison de ce problème, est-ce un bug? ou suis-je besoin de faire un pas de plus dans le concepteur de model de entity framework?

C'est un bug. C'est arrivé parce que vous avez renommé vos pocos et / ou dbsetnames.

Réessayez dbfirst sans renommer et vous l'encombrerez certainement!

Cela m'est arrivé dans la situation suivante:

  • DB d'abord
  • aucune entité renommée manuellement après la mise à jour du model à partir de la database.
  • une table appelée Utilisateurs
  • ' Pluraliser ou singulariser les noms d'objects générés ' activé

Je l'ai résolu en renommant la table en User .

NB: J'ai creusé un peu avec .Net Reflector pour arriver à une solution et je suppose que l'EntityFramework.MappingAPI essaye de find la table User , car le POCO s'appelle User , bien qu'il n'ait pas creusé plus loin une fois que je l'avais corrigé .

Pour moi, l'erreur a été causée par l'atsortingbut Column utilisé sur une entité random. Par exemple:

[Colonne ("LanguageName")]

string publique Name {get; set; }

C'est clairement un bug dans le mappage des colonnes BulkInsert.

En remarque: le développeur qui n'a pas vérifié la key dans ce dictionary devrait se sentir mal. Il a perdu beaucoup de time pour nous.

Codage heureux.