2013-04-12 4 views
2

Im использованием Breeze в моем проекте ASP.NET WebAPI, я добавил breezecontrollerBreeze, CreateEntity

[BreezeController]  
    public class BreezeController : ApiController 
    { 
     readonly EFContextProvider<MyEntities> _context 
      = new EFContextProvider<MyEntities>(); 

     [HttpGet] 
     public string Metadata() 
     { 
      return _context.Metadata(); 
     } 

, к сожалению, когда я звоню CreateEntity я получаю ошибку Невозможно прикрепить объект к EntityManager без предварительной установки его ключ или присвоение объекта entityType «AutoGeneratedKeyType» для чего-то другого, кроме «Нет»

Не является ли ветер автоматическим инициализацией объекта при вызове метаданных api?

TIA

ответ

2

Пожалуйста, напишите свой код на стороне клиента. Без этого я не могу точно сказать, но я бы предположил, что вы не получили метаданные для этого объекта перед вызовом «createEntity». Перед созданием объекта необходимо иметь хранилище метаданных. Например:

breezeProjectManager().metadataStore.fetchMetadata().then(function() { 
    //createEntity code here 
} 
+0

Я нахожу это для интериоризации бризостаза breeze.NamingConvention.camelCase.setAsDefault(); var mgr = new breeze.EntityManager ( { serviceName: config.remoteServiceName } ); –

7

Я держу пари, что сущность, которую вы пытаетесь создать определяется таким образом, чтобы клиент ... не сервер ... отвечает за создание уникального ключа. Готов поспорить, что ключевым свойством является Guid, потому что EF Code First предполагает, что свойства ключа ключа определяются клиентом по умолчанию.

Если да, то это зависит от вас, чтобы установить ключ при создании объекта ПЕРЕД добавлением нового объекта в диспетчер.

Вы решили создать новый объект с помощью метода EntityManager.createEntity. Это тоже мой любимый.

Но вы должны помнить, что этот метод пытается автоматически добавить новую организацию к менеджеру (как объяснено here). Поэтому, чтобы использовать этот метод, вы должны инициализировать ключ для нового объекта до того, как Breeze добавит его в менеджер. Вы можете сделать это в одном из трех способов:

  1. в пользовательском конструкторе, который вы определили и зарегистрированы с типом
  2. в пользовательском инициализаторе, что вы определили и зарегистрированы с типом (см " Extending Entities "для обеих методик)
  3. в параметре инициализатора для вызова createEntity.

Вариант № 3 выглядит следующим образом:

 
var newThing = manager.createEntity("Thing", {id: breeze.core.getUuid()}); 

я бы выбрал вариант # 1 сам.

+1

, так как бы вы хотели создать объект (и возвращаться как наблюдаемый KO) для экрана формы «Добавить новый XXX», когда пользователь должен указать идентификатор (в моей строке строки длиной 7)? Вы просто указали не-уникальный временный ключ (например, «tmpXXX») и обрабатываете валидацию при сохранении? Есть ли пример этого где-нибудь? – zam6ak

+0

@ Ward Спасибо за ответ, он решил мою проблему. Похоже, метод getUuid() теперь находится в breeze.core.Возможно, вы захотите обновить свой ответ, чтобы отразить это, чтобы люди не могли сами понять это. –

+0

Спасибо. Починил это. Я думаю, что это всегда было в «breeze.core» и что у меня просто была опечатка. – Ward

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

  • Нет связанных вопросов^_^