使用Breeze,創建實體時填充GUID鍵的最簡單方法是什麼?Breeze:如何爲客戶端上的新實體創建一個GUID鍵?
回答
我假設你的實體被配置成客戶端負責爲新實體設置Guid鍵。這是實體框架代碼優先實體的Guid鍵的默認值;這是因爲如果該鍵屬性用[DatabaseGenerated(DatabaseGeneratedOption.None)]
裝飾顯而易見的方法是創建實體後,並將其添加到管理員之前設置鍵,如:
function createFoo() { var foo = fooType.createEntity(); foo.id(breeze.core.getUuid()); // Knockout implementation manager.addEntity(foo); }
這可能是所有你曾經需要。
另一方面,您可能會發現在許多地方您正在創建新的Foos,並且出於某種奇怪的原因,您無法使用createFoo
函數。你當然不想重複該代碼。
可以擴展與ID設定的行爲Foo
實體類型之後,你可以寫:
function createFoo() { var foo = fooType.createEntity(); // foo.id is set for you manager.addEntity(foo); }
,需要考慮兩種方法 - 自定義的構造和類型初始化;兩者都在「Extending Entities」
構造
描述可以初始化一個自定義的構造函數中的關鍵。 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);
假設你在我們這裏對所有實體的Guid代理鍵就像我們,你可以編寫一個createInstance建立工廠,做下面一個非常通用的方法:
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);
}
這樣,您不必爲所有實體創建初始化程序。
- 1. 如何使用外鍵關係在Breeze中創建新實體?
- 2. 客戶端Breeze JS
- 3. 如何在新書上創建新客戶時在whmcs中創建客戶端?
- 4. 如何獲取Breeze中新創建的實體的條目ID
- 5. 我應該讓NHibernate爲創建的實體生成GUID,還是安全地生成GUID客戶端?
- 6. 如何創建一個新的實體
- 7. 如何讓客戶端爲其他客戶端創建一個套接字
- 8. 如何在rails 4上構建一個新的jabber客戶端?
- 9. Breeze客戶端不顯示實體名稱
- 10. 如何爲ios創建Gmail客戶端?
- 11. 如何爲網站創建客戶端?
- 12. 如何在一臺服務器上創建多個客戶端?
- 13. Breeze JS:實體錯誤阻止客戶端上的修補程序
- 14. Keynotfoundexception上創建客戶端
- 15. 如何創建一個爲每個客戶端創建一個新線程的服務器?
- 16. 如何創建一個磁鐵鏈接客戶端(爲前ThePiratBay)
- 17. 如何在python中爲ElasticSearch創建一個只讀客戶端?
- 18. 如何在EF中創建另一個實體的新實體?
- 19. 如何實現一個git客戶端?
- 20. CoreData:創建一個新實體作爲舊實體的父代
- 21. 如何爲客戶創建新字段
- 22. 創建可爲每個客戶端擴展的通用基礎實體
- 23. 創建一個Skype網絡客戶端
- 24. 創建一個WCF Web Api客戶端
- 25. 創建一個JavaScript SOAP客戶端
- 26. 創建一個客戶端陣列
- 27. 創建一個客戶端在PHP
- 28. 如何爲每個鍵/上下文/客戶創建一個對象的單個實例?
- 29. 是否有可能爲Android創建一個「客戶端到客戶端」系統?
- 30. 如何創建派生類的Breeze實體?
上面提到的'breeze.core.getUuid'方法是一個無證的非官方Breeze工具。我認爲它會成爲官方的......也許用不同的名字......但我無法證實這一點。使用風險自負(如我一樣)或複製其實施並將其作爲您自己的實用程序。 – Ward
只是仔細檢查:感嘆號是if語句中的錯字嗎? – user210757