Breeze'ı kullanarak, bir varlık oluşturulduğunda bir GUID anahtarını yerleştirmenin en basit yolu nedir?Esinti: İstemcide yeni varlıklar için bir GUID anahtarı nasıl oluşturabilirim?
cevap
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);
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.
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
Sadece iki kez kontrol etme: Ünlem işareti if ifadesinde bir yazım hatası mıdır? – user210757