2011-04-13 73 views
9

我想爲我的實體實現「默認」Id生成支持。將實體ID分配給EntityFramework實體4

保存實體時,我希望EntityFramework只爲實體生成id值(如果它尚未設置)。如果ID已經有一個非空值,非零值,我希望實體保存在數據庫中時保留該實體ID。

我正在將數據從遺留數據模型(從舊數據庫創建的EntityFramework模型)遷移到新創建的(模型優先的)EntityFramework模型。我們稱之爲舊模型A和新模型T.

通常,我希望T實體在保存時獲得它們的ID(它們都是int64),以便長期使用新模型。

目前,我明確分配T實體ID基於我正在遷移相應的A實體的Id。這是如此,遷移結果很容易檢查。但是,儘管我可以將T實體的ID分配給與我的遷移例程中的A實體相同的ID,但在保存實體後,Id值已更改。

是否有一種方法可以覆蓋T模型中所有實體的默認保存方法,因此只有在實體尚未保存之前,纔會指定id值?

我已經看過一些其他EntityFramework/Id的問題,但在我看來,他們都沒有問同樣的事情。

感謝您的任何線索。

回答

3

我看到你提到你正在使用Model First。不過,我有一個Code First樣本,可能會有所幫助。

在T實體上,您在id屬性上有[Key]屬性,不是?如果是這樣,您可以使用另一個屬性DatabaseGeneratedAttribute強制設置身份。

public class SomeEntity 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int? SomeEntityID { get; set; } 
} 

而且,有一個良好的API調用,實現類似的結果:

public class YourContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder dbModelBuilder) 
    { 
     base.OnModelCreating(dbModelBuilder); 

     var config = dbModelBuilder.Entity<SomeEntity>(); 
     config.Property(e => e.SomeEntityID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
    } 
} 
+0

感謝您的回覆,編輯。你的意思是「強制標識不被設置」在數據庫中?如果是這樣,那麼可以在實體的屬性中設置生成模型,以便完全禁用數據庫中的ID生成。我正在尋找的是在數據庫中自動分配身份的情況,如果它尚未分配的話。 IOW,有條件的或默認的分配。 – 2011-04-14 01:25:52

+0

上面的代碼確實會強制密鑰不被設置。聽起來像我們不是你在找什麼。我知道EF可以幫你做什麼。 – 2011-04-14 05:15:37

+0

再次感謝您的回覆,Ed。我想也許我可以將這種技術用於必須執行數據遷移並通過將偏分類置於遷移代碼本身中來顯式分配鍵的場景,然後允許EF在新的生產應用程序中爲我生成密鑰。我會快速回答你的答案,但不要選擇它作爲*答案,因爲我仍然想要得到我的問題中描述的行爲。 – 2011-04-16 04:31:04

3

繼續搜索後,閱讀和討論,一些朋友誰更瞭解EF比我目前做的,我認爲實現目前實體框架實現所需的唯一實用,可持續的方法是創建一個自定義實體框架提供程序,如this blog post中所述。

我是否有時間來實現這個是我必須弄清楚的,但我認爲我至少要結束這個答案。自定義提供程序也允許實現對實體的寫入屬性進行讀/加密解密。但是,這些功能都是我希望看到的EntityFramework未來版本的兩個特性。

相關問題