Неожиданный «Объект с таким же идентификатором уже существует в этом EntitySet»? - PullRequest
1 голос
/ 05 января 2012

Я получаю сообщение об ошибке при попытке добавить в EntitySet на стороне клиента.Следующий код периодически завершается сбоем в методе Add.

// On the DB side this has a primary key field of IDENTITY(1,1) called Id
var map = new EpisodeDictionaryMap();
map.DictionaryName = dictionary; // String
map.Section = section; // String
map.DictionaryVersion = version; // Int32

episode.EpisodeDictionaryMap.Add(map);

Я также вызываю Clear() в EntitySets для Episode и EpisodeDictionaryMap (среди прочих) не перед каждым вызовом этогокод, но время от времени, когда пользователь переходит на другой экран в приложении.Это недавнее изменение, поэтому оно может быть частью проблемы.

После изучения коллекции EpisodeDictionaryMap в DomainContext может показаться, что иногда существует несколько «новых» экземпляров EpisodeDictionaryMap, каждый с идентификатором 0, как и следовало ожидать до сохранения, и в этих случаях сохранение завершается без проблем, и правильные идентификаторы назначаются объектам на стороне клиента.

Учитывая, что это не кажется проблемой дляиметь несколько записей с идентификатором 0 в EntitySet одновременно (по крайней мере, пока они находятся в «новом» состоянии), я не понимаю, что пытается сообщить мне сообщение об ошибке.

Я заметил, что в некоторых связанных с этим вопросах СО может возникнуть проблема с Композицией, однако я ее не использую.За исключением самой ссылки на Эпизод, также нет других ссылок на внешние ключи, которые также иногда вызывают эту ошибку.

Предложения, мысли?Большое спасибо!

Редактировать :

Полное исключение (нет внутреннего исключения)

System.InvalidOperationException occurred
    Message=An entity with the same identity already exists in this EntitySet.
StackTrace:
    at System.ServiceModel.DomainServices.Client.EntitySet.AddInternal(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.<Add>b__5(EntitySet l, Entity e)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityCollection(IEntityCollection entityCollection, PropertyInfo propertyInfo)
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityRef(IEntityRef entityRef, Entity parent, PropertyInfo propertyInfo)
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityRef(IEntityRef entityRef, Entity parent, PropertyInfo propertyInfo)
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Infer(EntityContainer container, Entity entity, Action`2 action)
    at System.ServiceModel.DomainServices.Client.EntitySet.Add(Entity entity)
    at System.ServiceModel.DomainServices.Client.EntityCollection`1.Add(TEntity entity)
    at TangoSoft.Client.EpisodeExtensions.SaveDictionaryVersion(Episode episode, String dictionary, String section, Int32 version)

Ответы [ 2 ]

0 голосов
/ 09 января 2012

После долгих проб и ошибок я обнаружил, что сущность, только косвенно связанная с ошибочной сущностью, все еще зависала в контексте и держала сущность с идентификатором 0. Я очищал каждый EntitySet, который содержал данные не для поиска - оказывается, этого недостаточно . Расследование в VS не давало мне простого способа найти сущность, о которой идет речь, однако профилирование с помощью ANTS выявило слишком много вещей, связанных исключительно с моими «поисковыми» сущностями EntitySet.

Мое исправление для этого состоит в том, чтобы очистить все мои EntitySet, как показано ниже:

foreach (var set in _context.EntityContainer.EntitySets)
{
    set.Clear();
}

Что до сих пор сбивает меня с толку, так это то, что это была периодическая ошибка; иногда не имело значения, что несколько контекстов типа T с Id 0 были в контексте, а в других случаях это приводило к ошибке.

0 голосов
/ 05 января 2012

Убедитесь, что первичный ключ (откройте файл .edmx в формате xml) для рассматриваемой таблицы имеет StoreGeneratedPattern = "Identity" в обоих разделах. Существует известная ошибка, когда EF через конструктор изменяет один раздел, но не изменяет другой раздел. Ищите это в обоих разделах:

<EntityType Name="TIMELINE">
          <Key>
            <PropertyRef Name="ID"/>
          </Key>

  <Property Name="ID" Type="decimal" Nullable="false" Precision="19" StoreGeneratedPattern="Identity" />

См. EF4: ошибка в StoreGeneratedPattern SSDL

...