2013-05-02 62 views
2

我們的SQL Server數據庫表中有一個由SQL Server自動生成的字段,該字段名爲CreatedTime如何在插入時忽略實體模型中的特定字段?

我們已經將整個數據庫表映射到實體框架中的數據模型,因此也是字段CreatedTime

當我們通過實體框架在數據庫中插入新行時,我們因此不會爲CreatedTime提供任何值。

這將導致插入失敗,出現錯誤:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM

所以現在的問題是:是否有在實體框架的實體數據模型插入​​語句來排除特定字段的方式?所以我們不會得到上述錯誤?

我們希望將字段CreatedTime保留在實體模型中,因爲我們可能想稍後訪問它。

回答

3

我發現了一個簡單的解決問題的方法在此線程:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/7db14342-b259-4973-ac09-93e183ae48bb

有費爾南多·索托寫道:

「如果你去了EDM設計器,點擊數據庫自動生成的表格中的字段,右鍵點擊它並選擇屬性,然後查看屬性窗口,單擊StoreGeneratedPattern並將其值設置爲計算,我相信它會給你你正在尋找的東西。「

上述解決方案超級快捷,它似乎工作。

也謝謝你的貢獻,但上面的解決方案似乎是做這項工作。

+0

這是否會持續更新數據庫,從造模後? – n00b 2016-04-05 17:40:44

0

創建時間可以爲空?

一個可能的解決方法 - 如果CreatedTime不能爲空:

DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0); 

if(myEntity.CreatedTime < sqlServerMinDateTime) 
{ 
    myEntity.CreatedTime = sqlServerMinDateTime; 
} 

// do insert here 
// .... 

一個可能的解決方法 - 如果CreatedTime爲空:

DateTime sqlServerMinDateTime = new DateTime(1753, 1, 1, 12, 0, 1, 0); 

if(myEntity.CreatedTime < sqlServerMinDateTime) 
{ 
    myEntity.CreatedTime = null; 
} 

// do insert here 
// .... 
1

th ERE有兩件事情可以做:

  1. 如果你有對數據庫的訪問,請檢查是否領域有着default值。如果沒有,您可以將其設置爲GETDATE(),並且該字段應該設置正確,並且您不必通過實體框架添加/更新它。

  2. 如果您無權訪問數據庫或不想在此進行任何更改,則可以更改實體數據模型的行爲以自動設置日期。簡單地擴展你的ObjectContext模型。

    public partial class MyEntities 
    { 
        public override int SaveChanges() 
        { 
         var entityChangeSet = ChangeTracker.Entries<SomeEntity>(); 
         if (entityChangeSet != null) 
         { 
          foreach (DbEntityEntry<SomeEntity> entry in entityChangeSet) 
          { 
           switch (entry.State) 
           { 
            case EntityState.Modified: 
             entry.Entity.LastModifiedDate = DateTime.UtcNow; 
             break; 
            case EntityState.Added: 
             entry.Entity.CreatedDate = DateTime.UtcNow; 
             break; 
           } 
          } 
         } 
         return base.SaveChanges(); 
        } 
    } 
    

這樣你就不必在您添加或更新項目添加任何信息這些領域,該模型將做到這一點你。如果您有需要的這種行爲多的實體,您可以創建一個接口,使實體類繼承:

public interface IHaveCreatedDate { 
    DateTime CreatedDate { get; set; } 
} 

public partial class MyEntity : IHaveCreatedDate { 
    //MyEntity already implements this! 
} 

然後,所有你需要做的是調用更改爲ChangeTracker:

var entityChangeSet = ChangeTracker.Entries<IHaveCreatedDate>(); 
3

如果使用流利的API:

using System.ComponentModel.DataAnnotations.Schema; 

this.Property(t => t.CreatedTime) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

如果使用註解

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public System.DateTime CreatedTime { get; set; } 
相關問題