2016-09-22 34 views
2

我有一種情況,我需要添加一個不是主鍵的Guid屬性,並且可以與表中的多個對象共享。在數據庫上生成Guid,但只有當未在實體中設置時

我想要做的是:

  • 生成的GUID在數據庫上時,我沒有給它的值
  • 設置一個GUID(而不是產生的話),當我有它值

這兩者都只在插入時完成,更新不會觸及這些值。

我曾嘗試:

  • 添加[DatabaseGenerated(DatabaseGeneratedOption.Identity)]屬性:當我不需要設置的GUID手動
  • 添加[DatabaseGenerated(DatabaseGeneratedOption纔有效。計算)]屬性:不,當我沒有設定的GUID手動

我已經看到了很多有關這個主題的時候,和最近的事情將是這篇文章: http://www.davepaquette.com/archive/2012/09/23/calculated-columns-in-entity-framework-code-first-migrations.aspx

但是我們沒有(也不會)在我們的項目中使用遷移,所以這似乎不合適。

或這太問題,但是這將意味着產生在.net中的GUID(這似乎不是很乾淨,至少在我看來):EF, Code First - How to set a custom Guid identity value on insert

有沒有一種方法來生成的GUID數據庫並且在我需要首先在EF代碼中設置它?

如果不是,那麼會有什麼好的選擇?在.Net端生成Guids是否真的是一個糟糕的主意? (我可以與去,如果沒有別的可能的話)

+0

您可以編輯您的遷移並設置爲默認值NEWID(),並將其標記爲databsegeneratedoption.identity – Monah

+0

@HadiHassan其實我們不(不會)在此使用的遷移項目......你知道另一種設置「newid()」的方法嗎? – ppetrov

+1

我想你只能用插入觸發器來設置guid,以防萬一出現空值。 –

回答

1

我會假設你正在使用MS-SQL,那麼你可以做以下

要使用執行命令

public class YourDbContext: DbContext 
{ 
    public YourDbContext():base("ConnectionString") 
    {    
      if (Database.Exists()) 
      {     
       Database.ExecuteSqlCommand("if object_id('CT_DefaultGuid') is null alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn"); 
      } 
    } 
} 

從中設置ID。淨,你可以做以下

  • 創建基礎實體包含Id屬性
  • 在您檢查如果ID是空的構造函數對其進行初始化
  • 讓你具有這繼承了實體類

你的基類應該看起來像

public class BaseEntity 
{ 
    public BaseEntity() 
    { 
      if(Id==Guid.Empty) 
       Id = Guid.NewGuid(); 
    } 

    public Guid Id{get;set;} 
} 

使用遷移從PMC現有數據庫

  • =>Enable-migrations
  • 從PMC =>Add-Migration "FirstRun"
  • 打開生成的遷移文件,並確保清空UpDown方法(這不會對數據庫應用任何更改)
  • 使用Up方法中的Sql("")方法添加相應的alter column Fluent代碼
  • 來自PMC =>Update-Database -Script,確保只有在您確定所需的語句是唯一出現在SQL腳本中時,纔會生成的SQL語句是來自PMC =>的alter table語句
  • ,然後應用:Update-Database

你的類應該喜歡這個

public class FirstRun : DbMigration 
{ public override void Up() 
    { 
     Sql("alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn"); 
    } 
} 

我推薦的最後一種方法,它會被執行一次,並且以後可以到你的數據庫添加變化。

希望這將幫助你

+0

謝謝,你認爲正確,這確實有幫助,你能解釋一點嗎?這是否意味着這種檢查將在每個上下文創建時完成? (可以有很多這樣的) – ppetrov

+0

是的,它會在創建每個上下文時發生,這就是爲什麼我在評論中提出使用遷移的原因,遷移將爲您的代碼增加很大的潛力,例如創建視圖和種子數據。 – Monah

+0

這段代碼在第一次完全執行,並且會延遲執行if語句,如果您不想往返數據庫,您可以使用存儲在appsettings中的值封裝此代碼並在第一次運行後更新它,這將阻止代碼執行以後 – Monah

相關問題