2012-12-12 51 views

回答

15

我假設你的實體被配置成客戶端負責爲新實體設置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); 
+1

上面提到的'breeze.core.getUuid'方法是一個無證的非官方Breeze工具。我認爲它會成爲官方的......也許用不同的名字......但我無法證實這一點。使用風險自負(如我一樣)或複製其實施並將其作爲您自己的實用程序。 – Ward

+1

只是仔細檢查:感嘆號是if語句中的錯字嗎? – user210757

1

假設你在我們這裏對所有實體的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); 
} 

這樣,您不必爲所有實體創建初始化程序。

相關問題