Esempio n. 1
0
        /// <summary>
        /// 按实体属性更新上下文中指定实体的状态
        /// </summary>
        /// <typeparam name="TEntity">实体类型</typeparam>
        /// <typeparam name="TKey">实体主键类型</typeparam>
        /// <param name="dbContext">上下文对象</param>
        /// <param name="propertyExpression">实体属性表达式,提供要更新的实体属性</param>
        /// <param name="entities">附带新值的实体对象,必须包含主键</param>
        public static void Update <TEntity, TKey>(this DbContext dbContext,
                                                  Expression <Func <TEntity, object> > propertyExpression,
                                                  params TEntity[] entities)
            where TEntity : EntityBase <TKey>
        {
            propertyExpression.CheckNotNull("propertyExpression");
            entities.CheckNotNull("entities");

            ReadOnlyCollection <MemberInfo> memberInfos = ((dynamic)propertyExpression.Body).Members;

            foreach (TEntity entity in entities)
            {
                DbSet <TEntity> dbSet = dbContext.Set <TEntity>();
                try
                {
                    DbEntityEntry <TEntity> entry = dbContext.Entry(entity);
                    entry.State = EntityState.Unchanged;
                    foreach (MemberInfo memberInfo in memberInfos)
                    {
                        entry.Property(memberInfo.Name).IsModified = true;
                    }
                }
                catch (InvalidOperationException)
                {
                    TEntity          originalEntity = dbSet.Local.Single(m => Equals(m.Id, entity.Id));
                    ObjectContext    objectContext  = ((IObjectContextAdapter)dbContext).ObjectContext;
                    ObjectStateEntry objectEntry    = objectContext.ObjectStateManager.GetObjectStateEntry(originalEntity);
                    objectEntry.ApplyCurrentValues(entity);
                    objectEntry.ChangeState(EntityState.Unchanged);
                    foreach (MemberInfo memberInfo in memberInfos)
                    {
                        objectEntry.SetModifiedProperty(memberInfo.Name);
                    }
                }
            }
        }
Esempio n. 2
0
 public void ChangeState(EntityState state)
 {
     _stateEntry.ChangeState(state);
 }