0

我們有一個包含多個表的SQL Server 2008 R2數據庫,每個表都有一些觸發器。在其中一列中,我們將調用這個Person.Age,我們有一個默認值,這樣如果我沒有明確提供一個值,它默認爲「18」。實體框架和SQL Server表屬性

create table PERSON 
(
id        int    IDENTITY(1,1) PRIMARY KEY, 
age        char(2)   DEFAULT '18', 
Name       char(40), 
); 

我使用的EntityFramework 4.0(和還試圖5.0)和Visual Studio 2010,加載和從數據庫中選擇。每當我用下面的語句插入到表中,它被插入行,但不完成的默認值:

var person = new Person 
{ 
    Name = "Peter" 
}; 

using (var ctx = new MyEntities()) 
      { 
       ctx.PERSON.AddObject(person); 
       ctx.SaveChanges(); 
      } 

這將導致與彼得的名字一排,但年齡會被設置爲空 - 而不是我的默認值爲18.

當我刷新/加載我的EDMX文件時,我似乎只能導入簡單的表和視圖,而且似乎沒有導入屬性的選項 - 雖然我會認爲這是默認完成的?任何想法爲什麼默認屬性不會觸發?

此外,我在SQL Server中定義了觸發器,以便在將新行插入到PERSON中時,會更新附加表。如果我直接針對數據庫運行SQL,但是如果我使用EntityFramework通過Visual Studio執行,則此功能仍然有效。

謝謝,

回答

0

EF將顯式地將列設置爲您傳遞的值。因爲,當你創建一個Person實體時,age的值將被默認設置爲null,EF將發送一個命令,它將列值設置爲null。如果要使用默認值(在默認值爲null的情況下爲參考屬性,默認值爲(T)爲值類型的屬性(例如int)),請在ctor中設置默認值。

EF設計人員從數據庫中提取所有列,並創建一個模型,該模型的實體具有的屬性與對應的表格和列的值相對應。然後,您可以在設計器中調整模型 - 例如,您可以移除您不需要的屬性。

我不知道什麼「不起作用」在觸發器的情況下對您意味着 - 它可能取決於您的期望。 EF只是發送一個命令到數據庫。因此,如果您發送與EF發送相同的Sql命令,它應該以相同的方式「不起作用」。話雖如此,EF是數據庫不可知的,並不知道像觸發器的數據庫魔術。此外,通信只是從EF到DB的一種方式。所以,如果你期望數據庫通知EF關於某事,那麼它將無法工作。沒有辦法做到這一點。