страшные идентификаторы не могут быть сгенерированы автоматически для объектов с составными ключами

Хорошо, я в растерянности, будучи новичком в бризе, я все еще изучаю веревки. В моем проекте используется шаблон горячего полотенца для AngularJs и ветерок от John Papa.

Это то, чего я пытаюсь добиться: у меня есть таблицы master\slave в моей базе данных. «Агентство» имеет много людей, которых оно может «уведомить». Вот классы EF для серверной части:

public class Agency {

    public Agency() {  
    this.Notifies = new HashSet<Notify>();
   }

   public long Id { get; set; }

   [Required, MaxLength(50)]
   public string Name { get; set; }
   <<removed unneeded details>>
   public bool Active { get; set; }

   public virtual ICollection<Notify> Notifies { get; set; }
}   

public class Notify
{
   public long Id { get; set; }
   public long? AgencyId { get; set; }
   public string Name { get; set; }
   <<removed unneeded details>>

   public virtual Agency Agency { get; set; }
}

Теперь Карты:

public class AgencyMaps : EntityTypeConfiguration<Agency>
{
   internal AgencyMaps()
   {
     HasKey(x => x.Id);
   }
}

public class NotifyMap : EntityTypeConfiguration<Notify>
{
   internal NotifyMap()
   {
      HasKey(x => x.Id);

      HasOptional(x => x.Agency)
         .WithMany(p => p.Notifies)
         .HasForeignKey(i => i.AgencyId);
   }
}

Теперь на стороне клиента я использую ветер для создания новых объектов, подобных этому:

// create a new entity
function create() {
  return manager.createEntity(entityName);
}
// create a new notify entity
function createNotify(){
    return manager.createEntity(entityNameNotify);
}

Затем есть два сценария, которые мне нужно выполнить: - во-первых, я получаю существующее агентство и добавляю дополнительных людей для уведомления - во-вторых, когда я создаю новое агентство и добавляю людей для уведомления

Оба терпят неудачу в одном и том же месте.

Примечание. Я использую SQL-сервер, и на данный момент мои поля Id имеют значение bigint (длинное).

Я извлекаю объект «Агентство» и помещаю его в переменную с именем «vm.agency». «vm.agency» имеет навигацию под названием «уведомления» с типом сущности «Уведомлять». Поэтому, когда я хочу создать и добавить нового человека, я вызываю эту функцию:

function addNotifyRec(){
   if (vm.agency !== undefined){
      var notifyRec = datacontext.agency.createNotify(); //<<< fails here
      notifyRec.agencyId = vm.agency.id;
      notifyRec.name = vm.notify.name;
      <<removed unneeded details>>
      vm.agency.notifies.push(notifyRec);
      logSuccess(“New person to notify added”);
   }
   else
   { logError(“Agency is undefined”); }
}

Как только вызывается createNotify(), я получаю сообщение об ошибке «Идентификаторы не могут быть сгенерированы автоматически для сущностей с составными ключами».

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

ОБНОВЛЕНИЕ 09.04.2014 Я думаю, что мог бы полностью устранить эту проблему, если бы переключился на идентификатор guid и сгенерировал их на стороне клиента. Это правильное мышление?


person user3468873    schedule 09.04.2014    source источник


Ответы (2)


Что здесь интересно, так это то, что Breeze считает, что Notify.Id и Notify.AgencyId являются составными первичными ключами, но на самом деле это не так. Id — это PK, а AgencyId — это FK. Единственное, что я могу придумать, это попробовать удалить EntityTypeConfiguration как для Agency, так и для Notify, особенно ту часть, где он указывает HasKey и HasForeignKey. Эта конфигурация Fluent API не требуется, так как вместо этого EF будет соответствовать вашей конфигурации по соглашению.

person DenisK    schedule 09.04.2014
comment
Если вы все еще застряли, пожалуйста, обновите фрагменты, которые показывают метаданные для этих двух типов. Установите точку останова, где вы можете получить EntityManager, а затем получить метаданные в консоли, например. em.metadataStore.getEntityType('Agency'); Откажитесь от неинтересных свойств, но покажите ключи, fks и навигационные реквизиты. - person Ward; 10.04.2014

Я использовал другой подход к решению моей проблемы. Поскольку у меня есть возможность изменить типы идентификаторов, я заменил идентификаторы bigint на типы Uuid и удалил автоматическое создание идентификаторов в sql. Теперь я просто создаю свои собственные идентификаторы, используя breeze.core.getUuid() при создании новой записи. Не уверен, что это самый эффективный способ обойти проблему, но, похоже, он работает нормально.

person user3468873    schedule 15.04.2014