我試圖設置與SQL Server 2008的實體框架。我使用GUID爲我的表上的鍵。有沒有辦法設置它,以便數據庫自動生成密鑰?我嘗試將「RowGuid」設置爲true,並將列的默認值設置爲「(newid())」。無論哪種方式映射類仍然需要我在C#端給它一個Guid。有任何想法嗎?實體框架Guid
Q
實體框架Guid
10
A
回答
6
17.4.Can我使用服務器生成的GUID爲我的實體鍵?
不幸的是,在EF的v1版本中,這不被支持。儘管SQL Server有可能使用「uniqueidentifier」類型的列並將其默認值設置爲「newid()」,但在SQL Server 2000中,沒有很好的方法來提取服務器在當時生成的值做插入。但是,這可以在更新版本的SQL Server上完成,所以我們的目的是在EF的未來版本中找到一種乾淨的方式來特別支持這種支持,因此它可以在那些支持而不支持的數據庫上得到支持其他。目前,解決方法是在客戶端(理想情況下是在對象的構造函數中)而不是服務器上生成guid。
2
由於GUID是一個結構,一個空值永遠不會通過這樣的默認值不踢你可以考慮一個nullable Guid:的Guid?雖然這可能導致頭痛在這篇文章中提到:
我發現它容易,只需用一個新值初始化GUID:
private Guid _identifier = Guid.NewGuid();
如果是現有的記錄,填充對象時,它會被替換。如果不是,則會插入初始化值。
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
更新:微軟已經固定VS2010 SP1這個bug與hotfix KB2561001。
1
如何在部分類的靜態方法?
public partial class SomeEntity
{
public static SomeEntity Create()
{
return new SomeEntity() { Id = Guid.NewGuid(); }
}
}
相關問題
- 1. 實體框架6:關閉順序GUID
- 2. 實體框架6 Guid生成null?
- 3. 使用GUID和實體框架
- 4. 實體框架 - GUID爲EntityKey的SaveChanges
- 5. 實體框架+ Unity框架
- 6. 實體框架
- 7. 實體框架
- 8. 實體框架
- 9. 實體框架
- 10. 實體框架
- 11. 實體框架:實體
- 12. 實體框架實體
- 13. 實體框架實體json
- 14. 實體框架4.1爲從DB返回的實體對象添加一個GUID
- 15. 轉換guid到實體框架的字符串
- 16. 實體框架6.1.1搜索NULL Guid不起作用
- 17. 具有指定Guid的實體框架OrderBy
- 18. 實體框架4 - 映射存儲過程返回Guid
- 19. 自動生成主鍵(GUID)實體框架CTP5
- 20. 在實體框架中使用GUID時出錯
- 21. 實體框架:使用GUID作爲主鍵
- 22. 實體框架4主鍵作爲GUID和自動生成
- 23. 實體框架database-first + uniqueidentity結果沒有新的GUID ID
- 24. 自參照外鍵 - GUID - 實體框架4插入的問題
- 25. 實體框架TPC:爲什麼BaseEntity ID需要是Guid類型?
- 26. 關於Mysql實體框架的Guid屬性
- 27. 查詢GUID字段不起作用實體框架和Oracle
- 28. SQLite實體框架6提供程序如何處理Guid?
- 29. 如何在創建對象時從實體框架生成Guid
- 30. 如何在實體框架中有條件地生成DatabaseGenerated GUID
只要該列未設置爲實體鍵(或部分實體鍵),在這種情況下您將收到錯誤,則使用可以爲空的GUID工作。我喜歡初始化建議,儘管如果它識別出該字段的屬性的Guid/Key組合,它似乎會出現在盒子外面。 – Rob 2010-05-12 20:12:28