我有一个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