12

我遇到了一個代碼優先的問題。數據現在在數據庫中,所以我不能使用DropCreateDatabaseIfModelChanges類重新設置數據庫的種子,但我需要更改一個表,以便bigint列不是IDENTITY(1,1)。我設法使用SSMS來做到這一點,但現在我的EF代碼說它已經過時了。 這是有問題的表的代碼:實體框架4.1代碼優先KeyAttribute作爲非標識列

public class Vote { 
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long FacebookUserId { get; set; } 
    [Required] 
    public Entity Entity { get; set; } 
} 

所以我改變了我的表架構,和我的模型(我認爲是它的倒影,但我顯然是錯誤的),但EF仍然在說我的模型已經過時,並且我無法重新設定數據庫的種子以使其「完美」。

任何幫助將不勝感激。

感謝,

本傑明

回答

2

嘗試添加到您的OnModelCreating

modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 

這應該刪除異常模型是過時的,但直到這個時候,你必須始終同步模式,數據庫手動。

+0

這消除了錯誤,但現在我得到一個新的錯誤,因爲我在表中映射了「實體」,它告訴我只有原始類型是允許的。我是否需要在某個時候重新創建數據庫,如果有,我如何在不破壞數據的情況下做到這一點? (如果第一部分的答案是肯定的,我會把它變成一個新問題) – 2011-04-28 15:29:46

+0

你在代碼中改變了什麼。我以爲你只是增加了'DatabaseGenerated'屬性,但是這個抱怨未映射的實體。你不需要重新種子數據庫。 – 2011-04-28 18:18:21

+0

單獨的表,沒有任何改變,也只是重新播種它,仍然得到這個錯誤。 – 2011-04-28 18:45:14

4

this post ...

看來,實體框架,您插入標識列默認的期望。

解決這一嘗試

modelBuilder.Entity<BOB>() 
    .HasKey(p => p.Id) 
     .Property(p => p.Id) 
      .StoreGeneratedPattern = StoreGeneratedPattern.None; 

builder.Entity<BOB>().MapSingleType().ToTable("BOB"); 

或裝飾你的鑰匙在POCO ...

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public Int64 PolicyID { get; set; } 
+1

只是澄清:它應該是'[DatabaseGenerated(DatabaseGeneratedOption.None)]',而不是'[DatabaseGenerated(DatabaseGenerationOption.None)]' – z00l 2015-08-18 08:48:23

9

使用數據註釋:

public class Customer 
{ 
[Key] 

    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int CustomerID { get; set; } 
} 

使用流暢API :

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Customer>().Property(c => c.CustomerID).HasDatabaseGeneratedOption(null); 
    base.OnModelCreating(modelBuilder); 
}