我有BaseEntity
:
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();
不要更新&#34; CreatedOn&#34;字段,我将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 :(得分: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它不需要将该参数发送到您的procs,因为数据库将生成该列/属性的值。您必须记住,存储过程必须在其结果集中返回该列 - 但它只能使用该过程中生成的该列的默认值。
如果你这样做,SaveChanges的覆盖设置默认值甚至不需要,在SaveChanges()之后将为你设置值。
仅供参考:实体框架6.x此处。