2012-12-12 21 views

cevap

15

Varlığınızın, yeni varlıklar için Guid anahtarını ayarlamadan müşterinin sorumlu olacak şekilde yapılandırıldığını varsayalım. Bir Varlık Çerçeve Kodu İlk varlığının Guid anahtarının varsayılanı budur;

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

Bu, şimdiye kadar tüm çekebilir: anahtar özellik [DatabaseGenerated(DatabaseGeneratedOption.None)]

süslenmiş olsaydı bariz yaklaşım varlık oluşturduktan sonra ve yöneticiye eklemeden önce anahtar ayarlamaktır gibi mesela, olduğu gerekir.

Diğer taraftan, birçok yerde yeni Foos oluşturduğunuzu ve garip bir nedenle createFoo işlevini kullanamayacağınızı görebilirsiniz. Bu kodu kesinlikle tekrarlamak istemezsiniz.

Yazman mümkün olurdu bundan sonra id-ayar davranışı ile Foo varlık türünü uzatabilirsiniz:

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

dikkat edilmesi gereken iki yaklaşım vardır - özel yapıcı ve tür başlatıcısı; Her iki Özel bir kurucu içinde anahtar başlatabilir "Extending Entities"

Oluşturucu

açıklanmıştır. Breeze, hem varlığı oluşturduğunuzda hem de sorgulanan bir varlığa ulaştığı zaman kurucuyu çağırır. Breeze, materyalleştirirken ilk anahtar değerin yerini alacak.

Knockout model kitaplığını varsayan bir örnek.

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

Oldukça basit. Tek dezavantajı, Breeze'in bir varlık oluşturduğunda her zaman bir kılavuz oluşturmasıdır. Materyalizasyon sırasında çaba harcanıyor, ama ne oldu? Sanırım, ölçülene kadar, 'un bir performans sorunu olabileceğini varsayalım.

Initializer

Eğer ölçülen varsayalım ve tekrarlanan Guid nesil ciddi bir sorundur (gerçekten?). Anahtarı bunun yerine bir tür başlatıcıya ayarlayabilir ve yalnızca yeni bir varlık oluştururken Kılavuz jeneratörü arayabilirsin. Breeze,'dan sonra bir tür başlatıcıyı çağırır ve bu varlığın uygulamaya geri döndürülmesinden hemen önce sorgudan oluşturuldu veya materyalleştirildi. Açıkça, veritabanından maddi değeri olan bir anahtarın üzerine yazmak istemezsiniz. Bu nedenle, anahtarın değerini atamadan önce gerçek olmadığından emin olmak için (yani, oluşturulmuş bir varlığı düzelttiğinizden emin olmak için) test edersiniz. İşte bir örnek.

function createInstance(breezeEntityManager, typeName) { 
    var keyProperty = breezeEntityManager.metadataStore.getEntityType(typeName, false).dataProperties.filter(function (p) { 
     return p.isPartOfKey; 
    })[0]; 
    var config = {}; 
    config[keyProperty.name] = breeze.core.getUuid(); 
    return breezeEntityManager.createEntity(typeName, config); 
} 

Bu şekilde:

 
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); 
+1

Yukarıda bahsedilen "breeze.core.getUuid" yöntemi belgesiz, gayri resmi bir Breeze yardımcı programıdır. Bence resmi olacak ... belki de farklı bir isim ... ama bunu doğrulayamıyorum. Kendi sorumluluğunuzda kullanın (yaptığım gibi) veya uygulamasını kopyalayın ve kendi yararınıza yapın. – Ward

+1

Sadece iki kez kontrol etme: Ünlem işareti if ifadesinde bir yazım hatası mıdır? – user210757

1

Elimizdeki gibi bizim durumumuzda tüm varlıklar üzerinde bir Guıd vekil Key var varsayarsak, çok genel bir yaklaşımla şunları yapan CreateInstance fabrikası kodu yazabilirsiniz tüm varlıklarınız için bir başlatıcı oluşturmanız gerekmeyecek.