2008-12-01 66 views
10

我試圖設置與SQL Server 2008的實體框架。我使用GUID爲我的表上的鍵。有沒有辦法設置它,以便數據庫自動生成密鑰?我嘗試將「RowGuid」設置爲true,並將列的默認值設置爲「(newid())」。無論哪種方式映射類仍然需要我在C#端給它一個Guid。有任何想法嗎?實體框架Guid

回答

6

Not yet

17.4.Can我使用服務器生成的GUID爲我的實體鍵?

不幸的是,在EF的v1版本中,這不被支持。儘管SQL Server有可能使用「uniqueidentifier」類型的列並將其默認值設置爲「newid()」,但在SQL Server 2000中,沒有很好的方法來提取服務器在當時生成的值做插入。但是,這可以在更新版本的SQL Server上完成,所以我們的目的是在EF的未來版本中找到一種乾淨的方式來特別支持這種支持,因此它可以在那些支持而不支持的數據庫上得到支持其他。目前,解決方法是在客戶端(理想情況下是在對象的構造函數中)而不是服務器上生成guid。

2

由於GUID是一個結構,一個空值永遠不會通過這樣的默認值不踢你可以考慮一個nullable Guid:的Guid?雖然這可能導致頭痛在這篇文章中提到:

Nullable GUID

我發現它容易,只需用一個新值初始化GUID:

private Guid _identifier = Guid.NewGuid(); 

如果是現有的記錄,填充對象時,它會被替換。如果不是,則會插入初始化值。

+0

只要該列未設置爲實體鍵(或部分實體鍵),在這種情況下您將收到錯誤,則使用可以爲空的GUID工作。我喜歡初始化建議,儘管如果它識別出該字段的屬性的Guid/Key組合,它似乎會出現在盒子外面。 – Rob 2010-05-12 20:12:28

3

就我個人而言,我認爲任何使用EF的人都願意放棄與SQL Server 2000的兼容性,以獲得他們所需的功能。似乎我在EF中需要做的每件事情都是不受支持的,因爲它們必須保持與SQL Server 2000的兼容性。

它什麼時候纔會結束!

2

使用v4更容易。

比改變edmx更好的方式是我下面的那個會爲你生成Guid的位。它檢查主鍵並反映設置它。

警告 - 假設一個Guid主鍵,並且由於某種原因您沒有設置它。

void OgaraEntities_SavingChanges(object sender, EventArgs e) 
{ 
    foreach (ObjectStateEntry entry in 
     ((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries(
     EntityState.Added)) 
    { 
    if (!entry.IsRelationship){ 
     string keyFieldName = entry.EntitySet.ElementType.KeyMembers[0].Name; 
     object entity = entry.Entity; 
     PropertyInfo pi = entity.GetType().GetProperty(keyFieldName); 
     pi.SetValue(entity, Guid.NewGuid(), null); 
    } 
    }  
} 
1

如何在部分類的靜態方法?

public partial class SomeEntity 
{ 
    public static SomeEntity Create() 
    { 
     return new SomeEntity() { Id = Guid.NewGuid(); } 
    } 
}