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.
- 1. Delphi'de bir Canlı Şablon çağrıldığında nasıl bir GUID oluşturabilirim?
- 2. Yeni bir HttpContext nasıl oluşturabilirim?
- 3. openstack4j ile nasıl yeni bir rol oluşturabilirim?
- 4. esinti - bu
- 5. LINQ'da Varlıklar için SQL "Var Olan Varlıklar" nasıl yapılır?
- 6. GUID adımı nasıl oluşturmalıyım?
- 7. GUID nasıl oluşturulur?
- 8. Sonuç listesinde Yönetici Konsolu kullanılarak GAE Datastore'daki Varlıklar için URL güvenli anahtarı nasıl alınır?
- 9. Liste şablonundan (İstemci Nesne Modeli) yeni bir liste nasıl oluşturabilirim?
- 10. Nodejs Yayınla/abone olmak için istemcide yayımla
- 11. Mevcut veriler için MySQL'te GUID üretin?
- 12. Javascript'te tip-dizgeye dayalı olarak yeni bir nesneyi nasıl oluşturabilirim?
- 13. git-svn: git ile yeni bir svn dalı nasıl oluşturabilirim?
- 14. SD kartta yeni bir dizini program aracılığıyla nasıl oluşturabilirim?
- 15. guid/uuid
- 16. İstemcide SinyalR iletisi alınmıyor
- 17. Accounts.createUser(), istemcide tanımlanmamış olarak döndürülüyor
- 18. Bir yabancı anahtarı, bir on-delete kaskad kısıtlamasıyla güncelleyen bir Rails geçişini nasıl oluşturabilirim?
- 19. Javadocs için dağıtılabilir bir kavanoz nasıl oluşturabilirim?
- 20. Derlemem için nasıl özel bir özellik oluşturabilirim?
- 21. Matplotlib için nasıl bir ön uç oluşturabilirim?
- 22. Varlıklar sorgusuna "hariç" LINQ nasıl yapabilirim?
- 23. Bir ObjectSet örneğini nasıl oluşturabilirim?
- 24. Pandalarda nasıl bir sütun oluşturabilirim?
- 25. İstemcide değil, xmlrpc sunucuda traceback nasıl görülebilir?
- 26. Ham varlıklar nasıl kullanılır?
- 27. CouchDB en iyi uygulamaları - tek bir db'deki tüm varlıklar, her varlık için yeni bir db'ye mi?
- 28. Varlıklar için LINQ, 'System.DateTime GetValueOrDefault()'
- 29. İş Birimi/Havuz Kalıbı ile Esinti
- 30. guid REST URL?
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