实体框架MapToStoredProcedures不更新和更新对象的每个字段

时间:2016-01-19 06:28:50

标签: entity-framework stored-procedures mapping

我有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并不更新每列?

1 个答案:

答案 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此处。