2013-07-11 119 views
6

我有一個使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]屬性的EF5碼的第一個項目。該選項覆蓋了我的設置。實體框架5:使用DatabaseGeneratedOption.Computed選項

考慮這個SQL表:

CREATE TABLE Vehicle (
    VehicleId int identity(1,1) not null, 
    Name varchar(100) not null default ('Not Set') 
) 

我使用的是SQL默認的構造設置[名]的情況下沒有設置。

在後面的代碼,我有一個類定義類似於:

public class Vehicle { 
    ... 

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public string ShoulderYN { get; set; } 
} 

當我在代碼更新實體,在默認設置的值將覆蓋我的新的設置。

在代碼中,我有(僞):

vehicle.Name = 'Update Name of Vehicle'; 
_dbContext.Update(vehicle); 
_dbContext.SaveChanges(); 

預期的結果是Vehicle.Name = '車輛更新名稱'。

實際的結果是Vehicle.Name = '未設置'。

EF5有沒有一種方法可以說「如果Vehicle.Name爲空/空,使用數據庫中定義的值?否則,如果我在代碼中設置值,我想使用此值。

謝謝。

Steve

回答

9

顯然,沒有沒有。這並不是說聰明:)

正如你可能已經讀過,計算機選項只是告訴EF不更新你的專欄,東陽你會計算在DB-方自己的價值。 EF會剛剛從您的數據庫中返回新計算的值(在您的情況下「未設置」)。

你的基本三種選擇 - 按EF的源代碼文件:

  • 無 - 數據庫不產生價值。
  • 標識 - 數據庫在插入行時生成一個值。
  • Computed - 數據庫在插入或更新行時生成一個值。

https://github.com/aspnet/EntityFramework6/blob/527ae18fe23f7649712e9461de0c90ed67c3dca9/src/EntityFramework/DataAnnotations/Schema/DatabaseGeneratedOption.cs

既然你希望做一點更多的自定義邏輯,恐怕你就必須自己做。我建議你停止依靠數據庫默認約束,並在代碼優先方法中執行所有操作。這樣你就會有這樣的代碼:

public class Vehicle 
{ 
    public Vehicle() 
    { 
    this.Name = "Not set"; 
    } 

    // Without 'Generated' attribute 
    public string Name { get; set; } 
} 

這樣,當你的實體被創建時,它會自動啓動預期的默認值。並且可以稍後通過簡單修改Name屬性進行更改。

希望它有幫助!

0

我檢查這幾個小時得到很好的答案,但沒有: EF不能更新通過自動生成的-ID模型。

你有3種選擇:

  1. 添加另一個VehicleId到車型。
  2. 將自動生成的ID更改爲由您手動生成。
  3. 將唯一標識設置爲別的,然後在您的 模型中生成ID。 在您的車輛類別中,它可以是Name屬性。

我建議你選擇3: 將unique-id設置爲Vehicle.Name(並且可以添加更多屬性)。 那麼:如果車輛的唯一ID不存在,新的車輛加入到DB-背景:

​​
0

其實,有這個一個簡單的解決方案:

  • 你需要離開默認在表創建腳本值的限​​制,因爲它現在是:

    CREATE TABLE Vehicle (
        VehicleId int identity(1,1) not null, 
        Name varchar(100) not null default ('Not Set') 
    ) 
    
  • 剛剛從財產類定義中刪除DatabaseGenerated屬性:

    public class Vehicle { 
        ... 
    
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
        public string ShoulderYN { get; set; } 
    } 
    

就是這樣:現在的數據庫將使用默認值只有當你不指定在代碼中的一些價值。希望這可以幫助。

+0

爲什麼此行爲不是默認提供的?這背後的好處是什麼?例如,我確定DB中一列表中的默認日期(notnull)。但如果沒有代碼發送值,EF會發送最短日期時間。我真的找不到任何邏輯。 –