Ошибка CreateEntity с не определенными KeyProperties

Клиент извлекает метаданные из службы. Этот призыв успешен.

Но вызов entityManager.CreateEntity(); терпит неудачу.

Ошибка:

"Для EntityType еще не определены ключевые свойства:" Customer:#MyCommerceServer.Models ". Убедитесь, что метаданные для этого типа завершены, либо вызвав FetchMetadata, либо явно обновив ключевые свойства перед созданием EntityKey для этого типа".}}

Но следующие проходы с исключением говорят, что клиент отделен.

var customerType = entityManager.MetadataStore.GetEntityType(typeof(Customer));
var customer = customerType .CreateEntity();

Вот мои настройки. У сущности Customer есть ключ с именем Id. Сущность Customer на клиенте также имеет тот же ключ. Объекты на клиенте и сервере существуют в одном и том же пространстве имен.

Есть ли какие-либо настройки, которые я должен добавить, чтобы иметь сущность Customer KeyProperties? Я вижу ту же проблему в примере проекта ToDo.

******** Обновление от 12.08.2014

На сервере:

namespace MyCommerceServer.Models
{
public class Customer
{
public int Id { get; set; }
}
}

На клиенте:

namespace MyCommerceServer.Models
{
public class Customer : BaseEntity
{
public int Id
{
get { return GetValue<int>(); }
set { SetValue(value); }
}
}
}

1 ответ

Решение

Разница между методом Breeze.sharp EntityManager.CreateEntity и методом EntityType.CreateEntity заключается в том, что первый, по умолчанию, добавляет вновь созданную сущность в EntityManager, а второй - нет. Ошибка, которую вы получаете, возникает, когда объект добавляется в EntityManager, и у этого объекта либо не определен ключ, либо для ключа заданы только значения по умолчанию для всех свойств ключа. Ключ необходим, прежде чем объект может быть присоединен, потому что объект кэшируется в EntityManager его ключом.

Итак, у вас есть несколько вариантов,

  • Вы можете установить ключевые свойства в вызове EntityManager.createEntity, используя объект anon, например так:

    var newCust = (Customer) myEntityManager.CreateEntity(typeof(Customer), 
           new { Id = 999 }));
    
  • или вы можете использовать метод EntityType.CreateEntity и установить Id перед добавлением объекта в entityManager.

    var customerType = myEntityManager.MetadataStore.GetEntityType(typeof(Customer));
    var customer = customerType.CreateEntity();
    customer.Id = 999;
    myEntityManager.AddEntity(customer);
    
  • или вы можете изменить свои метаданные для типа клиента, чтобы использовать ключи идентификации. Это будет означать, что для свойства AutoGeneratedKeyType клиента установлено значение Identity или KeyGenerator. Обратите внимание, что любой из них потребует изменений в вашей модели на стороне сервера, чтобы учесть это изменение.

    var customerType = entityManager.MetadataStore.GetEntityType(typeof(Customer));
    Assert.IsTrue(customerType.AutoGeneratedKeyType == AutoGeneratedKeyType.Identity);
    
Другие вопросы по тегам