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