2015-12-02 61 views
0

我有我用我的所有實體的基礎的實體基類的7個數據註解支持不會出現[DatabaseGenerated(DatabaseGeneratedOption.Identity)]實體框架[DatabaseGenerated(DatabaseGeneratedOption.Identity)]在Guid類型主鍵

有什麼影響。

創建的遷移有類似下面的CreateTable方法:

columns: table => new 
      { 
       Id = table.Column<Guid>(nullable: false),... 

這應該是:

Id = c.Guid(nullable: false, identity: true),... 

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 在實體框架7不再支持?或者我錯過了什麼?

回答

2

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]在EF7中受支持。

由於EF7針對各種數據庫提供者,它在遷移中存儲的方式發生了變化。由於並非所有提供者都支持標識列,因此不存在參數identity。相反,它被存儲爲提供者特定的註釋。因此,當列將被用作特定於SQL Server的列IDENTITY時,您將看到以下語法。

 Id = table.Column<int>(nullable: false) 
        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), 

DatabaseGeneratedOption.Identity的語義與以前相同。數據庫將在添加新行時生成一個值。當針對SQL-Server時,如果在任何整數類型屬性上指定,則EF7將爲其創建標識列。由於IDENTITY不能在非整數或非數字類型上指定,對於任何其他類型,不會有任何此類註釋。雖然該屬性仍然具有添加新行的功能會生成值的功能。

在您的示例中,屬性爲Guid類型,該類型在SQL-Server中轉換爲uniqueidentifier類型。此類型不能設置IDENTITY,因此在生成的遷移中沒有找到註釋。如果您嘗試添加沒有指定值的記錄,數據庫將爲您生成一個值。如果您明確將值設置爲屬性Id EF7將使用該值並將其傳播到數據庫。這將是預期的註釋效果。

+1

這是一個從EF6稍微令人失望的變化。無論如何,現在有必要進行遷移以將ID列上的「默認值或綁定」屬性設置爲(newsequentialid()) - EF6用於的方式? – John

+3

@John - 對於啓用了值生成的Guid類型的屬性,EF7使用與newsequentialid()相同的算法生成新的客戶端值。所以即使屬性'Default Value or Binding'沒有設置,行爲也應該保持不變。 如果要強制服務器,而不是生成生成它們的客戶端的值,可以使用以下在'OnModelCreating'方法代碼: 'modelBuilder.Entity ().Property(E => e.Id)。 HasDefaultValueSql(「newsequentialid()」);' 這將設置服務器上的默認值或綁定屬性爲'newsequentialid()'。 – Smit

+0

很酷,謝謝。我已經測試過這種方法。但是,雖然數據庫沒有生成密鑰,但我遇到了將實體添加到數據庫的問題,主密鑰由數據庫設置,但是EF隨後嘗試使用自己生成的密鑰更改該密鑰。導致我的實體庫拋出無效操作異常,如上面的代碼所示。現在我已經回到EF 6了,在嘗試認真使用它之前,我會多玩一點EF7。 – John