Breeze:如何为客户端上的新实体创建GUID密钥?

Rya*_* CS 11 guid breeze

使用Breeze,创建实体时填充GUID键的最简单方法是什么?

War*_*ard 15

我假设您的实体已配置为客户端负责为新实体设置Guid密钥.这是Entity Framework Code First实体的Guid密钥的默认值; 好像关键属性是用装饰的[DatabaseGenerated(DatabaseGeneratedOption.None)]

显而易见的方法是在创建实体之后并在将其添加到管理器之前设置密钥,例如:

function createFoo() {
    var foo = fooType.createEntity(); 
    foo.id(breeze.core.getUuid()); // Knockout implementation
    manager.addEntity(foo);
}

这可能就是你所需要的.

另一方面,您可能会发现您在许多地方创建了新的Foo,并且由于某些奇怪的原因您无法使用该createFoo功能.你当然不想重复那段代码.

您可以Foo使用id设置行为扩展实体类型,之后您就可以编写:

function createFoo() {
    var foo = fooType.createEntity(); // foo.id is set for you
    manager.addEntity(foo);
}

有两种方法需要考虑 - 自定义构造函数和类型初始值设定项; 两者都在" 扩展实体 " 中描述

构造函数

您可以在自定义构造函数中初始化键.Breeze在您创建实体时以及在实现查询实体时都会调用构造函数.Breeze将在实现时替换初始键值.

这是一个假设Knockout模型库的例子.

function Foo() {
    foo.id(breeze.core.getUuid()); // using KO
}

// one way to get the MetadataStore
var store = manager.metadataStore;
// register the ctor with the Foo type
store.registerEntityTypeCtor("Foo", Foo);

很简单.唯一的缺点是Breeze每次创建一个实体时都会生成一个Guid,无论是创建一个实体还是从查询中实现一个实体.在实现过程中浪费了精力,但那又如何呢?好吧,我想这可能会成为一个性能问题,虽然在我测量它之前我不会这么做.

初始化

假设您测量并且重复的Guid生成是一个严重的问题(真的吗?).您可以在类型初始化程序中设置密钥,而只在创建新实体时调用Guid生成器.

将实体返回到应用程序之前,Breeze 在创建实体或从查询中实现调用类型初始值设定项.显然,您不希望覆盖数据库中的物化键,因此您需要在分配之前测试键值以确保它不是真实的(即确保您正在修复已创建的实体).这是一个例子.

function fooInitializer(foo) {
    var emptyGuid = "00000000-0000-0000-0000-000000000000";
    if (foo.id() !=== emptyGuid) {
        foo.id(breeze.core.getUuid());
    }
}

var store = manager.metadataStore;
// register the initializer; no ctor in this example
store.registerEntityTypeCtor("Foo", function(){}, fooInitializer);