2016-01-19 51 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在这里。