0

客户端正在从服务中检索元数据。这个电话成功了。

但是调用entityManager.CreateEntity(); 失败了。

错误是:

“EntityType 上尚未定义 KeyProperties:'Customer:#MyCommerceServer.Models'。请通过调用 FetchMetadata 或在为此类型创建 EntityKey 之前显式更新 KeyProperties 来确保此类型的元数据是完整的。”}

但是以下通过异常表示客户已分离。

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

这是我的设置。Customer实体有一个名为Id的键。客户端上的Customer实体也具有相同的密钥。客户端和服务器上的实体存在于同一个命名空间中。

是否需要添加任何设置才能拥有客户实体 KeyProperties?我在 ToDo 示例项目中也看到了同样的问题。

******** 2014 年 8 月 12 日更新

在服务器上:

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); }
}
}
}
4

1 回答 1

1

Breeze.sharp EntityManager.CreateEntity方法和EntityType.CreateEntity方法之间的区别在于,第一个默认情况下将新创建的实体添加到 EntityManager 而第二个没有。当将实体添加到 EntityManager 并且该实体没有定义键或键设置为所有键属性的默认值时,就会出现您遇到的错误。在附加实体之前需要密钥,因为实体通过其密钥缓存在 EntityManager 中。

所以你有几个选择,

  • 您可以使用匿名对象在 EntityManager.createEntity 调用中设置关键属性,如下所示:

    var newCust = (Customer) myEntityManager.CreateEntity(typeof(Customer), 
           new { Id = 999 }));
    
  • 或者您可以使用 EntityType.CreateEntity 方法并在将实体添加到 entityManager 之前设置 Id

    var customerType = myEntityManager.MetadataStore.GetEntityType(typeof(Customer));
    var customer = customerType.CreateEntity();
    customer.Id = 999;
    myEntityManager.AddEntity(customer);
    
  • 或者您可以更改客户类型的元数据以使用身份密钥。这意味着客户的 AutoGeneratedKeyType 属性设置为IdentityKeyGenerator。请注意,其中任何一个都需要更改您的服务器端模型以适应更改。

    var customerType = entityManager.MetadataStore.GetEntityType(typeof(Customer));
    Assert.IsTrue(customerType.AutoGeneratedKeyType == AutoGeneratedKeyType.Identity);
    
于 2014-08-12T18:37:23.373 回答