2015-01-14 60 views
0

我想在我的模型中實現GUID作爲主鍵。我使用模型優先的方法,並且我希望GUID不是在數據庫中生成的,而是在.NET服務器中生成的。實體框架:使用GUID作爲主鍵

我見過一個解決方案,說我將不得不爲每個類做到這一點:

public class TestObject 
{ 
    public TestObject() 
    { 
     Id = Guid.NewGuid(); 
    } 

    public Guid Id { get; set; } 
} 

的問題是:我不認爲這是一個乾淨的解決方案,將其應用到每一個我有班級。

而我沒有POCO類,因爲我使用的是模型優先。

那麼,我該怎麼辦?這是最好的方法,你覺得呢?有什麼建議?

+3

讀金Tripp的[GUID的SQL Server中的主鍵和聚集鍵(http://www.sqlskills.com/blogs/kimberly/guids-as-primary-keys-andor-the-集羣的關鍵/)。從數據庫管理員的角度來看,作爲PK的GUID是一個**非常糟糕的選擇,由於大規模的碎片化,因此產生了巨大的負面性能影響。如果你有設計一個新的數據庫系統的麻煩 - **不要**使用GUID作爲你的主鍵! –

+0

我不太確定如何使用guid作爲PK:我認爲有幾個優點。當我必須合併來自不同dbs(銷售隊伍應用程序中的訂購表)的類似表格時,我沒有來自不同dbs的記錄,它們必須重新組織相同的PK,並且如果我在Web應用程序中公開PK(查詢字符串等)我有一個更好的安全性,成本爲0,因爲猜測其他記錄比較困難,當你看到PK是典型的自動增量整數時,事情就容易多了。你不能以此爲基礎的安全性,但成本爲0。 –

+0

我想使用GUID,因爲Luca在說什麼...... 我知道它沒有更好的性能,但我需要這樣做。你有沒有人知道我該怎麼做我在問什麼? –

回答

0

在這種情況下,並獨立於任何其他考慮回答這個問題,你應該:

  • 覆蓋的SaveChanges方法
  • 尋求增加實體
  • 設置其ID。

,如果你的類實現諸如

interface { 
    Guid Id {get; set;} 
} 

你的任務將變得更加容易的接口。

0

由於所有實體似乎都有Id作爲主鍵,所以最明顯的是修改t4模板,以便生成guid初始化。

在對實體產生(類似ModelName.tt)構造函數生成與啓動電流T4模板...

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public <#=code.Escape(entity)#>() 
    { 
<# 
     foreach (var edmProperty in propertiesWithDefaultValues) 

(在我的模板它開始於第37行)

更改到這一點。 ..

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public <#=code.Escape(entity)#>() 
    { 
       this.Id = Guid.NewGuid(); 
<# 
     foreach (var edmProperty in propertiesWithDefaultValues)