2011-03-17 15 views
4

您好我有一個Customer表。表中的一列是DateCreated。此列爲NOT NULL,但默認值是在db中爲此列定義的。實體框架爲NOT NULL列生成值,其中默認定義了db

當我使用我的代碼中的EF4添加新的Customer

var customer = new Customer(); 
customer.CustomerName = "Hello";     
customer.Email = "[email protected]"; 
// Watch out commented out. 
//customer.DateCreated = DateTime.Now; 
context.AddToCustomers(customer); 
context.SaveChanges(); 

上面的代碼生成以下查詢。

exec sp_executesql N'insert [dbo].[Customers]([CustomerName], 
[Email], [Phone], [DateCreated], [DateUpdated]) 
values (@0, @1, null, @2, null) 
select [CustomerId] 
from [dbo].[Customers] 
where @@ROWCOUNT > 0 and [CustomerId] = scope_identity() 
',N'@0 varchar(100),@1 varchar(100),@2 datetime2(7) 
',@0='Hello',@1='[email protected]',@2='0001-01-01 00:00:00' 

,並拋出以下錯誤

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. 
The statement has been terminated. 

能否請你告訴我怎麼列NOT NULL,其在數據庫級別都有默認值不應該由EF生成的值?

DB:

DateCreated DATETIME NOT NULL 

dateCreated會性質EF:

  • 可空:
  • 的getter/setter:公共
  • 類型:日期時間
  • 默認值:

感謝。

+0

哪些dateCreated會現場的在VS的EF編輯器的屬性? – 2011-03-17 15:44:26

+0

請在末尾看到我的編輯 – Kashif 2011-03-17 16:02:06

回答

7

根據我對EF(最小)的瞭解,它不會從模式中獲取默認值。插入行和列的事實被標記爲NOT NULL,意味着EF認爲它應該爲該列的值插入恰好具有DateTime.MinValue值的值。

您可能需要在實體構造函數中強制自己的值或創建一些工廠方法。

EF中的表設計器的屬性頁上是否有任何內容可讓您指定默認值?

+0

您還可以在EF模型中指定標量默認值(例如'false',但不是像DateTime.Now這樣的函數結果)。 – 2011-03-17 21:26:23

0

可能是DateCreated列是smalldatetime並且需要是datetime類型?嘗試更改Visual Studio或Management Studio中的列類型。

+0

編輯我的問題。謝謝您的幫助。 – Kashif 2011-03-17 16:02:31

3

NOT NULL列表示該屬性不可爲空,並且它必須在您的實體中具有值。如果您沒有指定像DateTime這樣的值類型的值,則默認值將被保留。 DateTime的默認值爲DateTime.MinValue

據我所知EF不支持使用NOT NULL列的情況,並且不會從您的應用程序發送任何值。唯一的例外是當您將StoreGeneratedPattern設置爲IdentityComputed時,但在這種情況下,您將無法在應用程序中設置值。

因此,您可以在應用程序或數據庫中設置值。不在兩個。

0
  1. 將dateCreated會允許空
  2. 添加觸發器INSERT

    CREATE TRIGGER [DBO]。[ItemCreated]

    ON [DBO]。[myTable的]

    AFTER INSERT

    AS

    UPDATE [DBO]。[myTable的]

    SET [dateCreated會] = GETDATE()

    WHERE [ID] IN(SELECT DISTINCT [ID] FROM [插入了])和[dateCreated會]爲NULL

+0

這可能會工作,但速度慢,(imo)髒。 – Undercover1989 2017-11-23 11:30:04

1

您必須對ORM說該屬性是由數據庫生成的。對於上例中Customer類中的例子,下面的代碼應該可以工作。

public class Customer{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]//The database generates a value when a row is inserted. 
    public int CustomerId { get; set; } 

    public string CustomerName { get; set; } 

    public string Email { get; set; } 

    public string Phone { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] //The database generates a value when a row is inserted or updated. 
    public DateTime DateCreated { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.IComputed)]//The database generates a value when a row is inserted or updated. 
    public DateTime DateUpdated { get; set; } 

} 

不要忘記添加

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 

主鍵,對於我不知道一個道理,當你在模型類使用DatabaseGeneratedAttribute的註釋至少一次,你必須指定生成的選項方法。當我使用它們時,我有一個錯誤,因爲ORM試圖在查詢語句中插入密鑰,而不是讓數據庫生成它們。

有三個數據庫生成選項

  • 已計算:數據庫生成當行被插入或更新的值。
  • 標識:數據庫在插入行時生成一個值。
  • :數據庫不會生成值。

您可以在這裏找到的文檔Database Generated Options