2016-01-19 61 views
1

我有一個BaseEntity實體框架MapToStoredProcedures更新和更新不是對象的每個領域

public class BaseEntity : IBaseEntity 
{ 
    [ScaffoldColumn(false)] 
    public string ID { get; set; } 

    [ScaffoldColumn(false)] 
    public DateTime CreatedOn { get; set; } 

    [ScaffoldColumn(false)] 
    public bool Deleted { get; set; } 
} 

而一個人的實體:

public class People : BaseEntity 
{ //Fields } 

我想要做的更新,插入,刪除與一個存儲過程,所以在我的上下文中這樣做:

modelBuilder.Entity<People>() 
    .MapToStoredProcedures(); 

對於不更新「CreatedOn」字段,我o verride的SaveChanges爲:

public override int SaveChanges() 
{ 
     var modifiedEntries = ChangeTracker.Entries() 
      .Where(x => x.Entity is IBaseEntity 
       && (x.State == System.Data.Entity.EntityState.Added || x.State == System.Data.Entity.EntityState.Modified)); 

     foreach (var entry in modifiedEntries) 
     { 
      IBaseEntity entity = entry.Entity as IBaseEntity; 

      if (entity != null) 
      { 
       DateTime now = DateTime.Now; 

       if (entry.State == System.Data.Entity.EntityState.Added) 
       { 
        entity.CreatedOn = now; 
       } 
       else 
       { 
        base.Entry(entity).Property(x => x.CreatedOn).IsModified = false; 
       }      
      } 
     } 

     return base.SaveChanges(); 
    } 

但是做更新時,存儲過程將運行並@createdOn參數和返回例外設置默認值。

如何才能使用MapToStoredProcedures並更新不是每一列?

+0

您是否試圖阻止人們更改「CreatedOn」屬性?什麼是例外?我認爲如果你確定'.IsModified == true'或以某種方式獲取現有條目並重置爲原始值(大量開銷和在事務中存在死鎖的危險),你可能會**拋出異常。但是您可能想要使用數據庫檢查約束或其他方法,這將更好地處理所需的情況。或者告訴EF該列是一個'DatabaseGeneratedOption.Computed',並且在插入時默認爲GetDate()。 – Arkaine55

回答

0

您可以讓數據庫爲您設置值嗎?

public class BaseEntity : IBaseEntity 
{ 
    [ScaffoldColumn(false)] 
    public string ID { get; set; } 

    [ScaffoldColumn(false)] 
    [DatabaseGeneratedOption(DatabaseGeneratedOption.Computed)] 
    public DateTime CreatedOn { get; set; } 

    [ScaffoldColumn(false)] 
    public bool Deleted { get; set; } 
} 

然後你的UPDATE過程甚至不應該傳遞參數。在UPDATE存儲過程中,如果不使用SQL Server,請將CreatedOn的值設置爲GETDATE(),GETUTCDATE()或其他值,以便在數據庫中設置日期值。

這裏的想法是設置DatabaseGenerated選項告訴Entity Framework它不需要將該參數發送到您的proc,因爲數據庫將生成該列/屬性的值。您必須記住,存儲的proc必須在結果集中返回該列 - 但它可以使用proc中生成的該列的默認值。

如果你這樣做,SaveChanges設置默認值的重寫甚至是不需要的,這個值將在SaveChanges()之後爲你設置。

FYI:實體框架6.x在這裏。