2014-01-06 59 views
0

我是新来的实体框架。我有一个SupplyItem实体实体框架更新一个父实体更新另一个父实体

public class SupplyItem 
{ 
    public virtual int Id { get; set; } 

    public virtual BaseProduct Product 
    { 
     get { return product; } 
     set { product = value; } 
    } 

    public virtual Boolean IsPublic 
    { 
     get { return isPublic; } 
     set { isPublic = value; } 
    } 
} 

当添加一个supplyitem对象首次,它是将产品和IsPublic正确属性。像这样,我为supplyitem实体添加了两个对象,两个对象都引用相同的产品。现在

,我改变isPublic属性为supplyitem实体的第二个对象,并更新这样

 UnitOfWork.Context.Entry(supplyItem1).State = EntityState.Modified; 

上面的代码行,更新isPublic属性正确的实体,但它使得空产品的supplyitem实体的另一个目的是参考相同的产品。

我不明白这种行为。任何指针都会非常有帮助! 谢谢。

回答

1

恩,当你升级,你不从数据库中读取,您的新一SupplyItem并设置ID,设置IsPublic,并保存,让你新的,产品属性是默认的对象(空)
当你做这些,更新整个对象(每个属性)。 所以如果你想字段更新部分,你应该做这样的

var entry = db.Entry(entity); 
if (entry.State == EntityState.Detached) 
{ 
    db.Set<TEntity>().Attach(entity); 
} 
entry.Property("propertyName").IsModified = true 

的propertyName为一个字符串,它必须与属性相同的名称 你可以用一个LAMDA

Update<TEntity>(TEntity entity, params Expression<Func<TEntity, object>>[] updateProperty) 
做到这一点

所以在功能,你需要找到表达propetyname

public static string GetExpressionText<TModel, TProperty>(Expression<Func<TModel, TProperty>> ex) 
    { 
     if (ex.Body.NodeType == ExpressionType.MemberAccess) 
     { 
      var memExp = ex.Body as MemberExpression; 
      if (memExp != null) 
      { 
       return memExp.Member.Name; 
      } 
     } 
     else if (ex.Body.NodeType == ExpressionType.Convert) 
     { 
      var exp = ex.Body as UnaryExpression; 
      return GetExpressionText(exp); 
     } 
     return string.Empty; 
    } 

    public static string GetExpressionText(UnaryExpression exp) 
    { 
     if (exp != null) 
     { 
      if (exp.Operand.NodeType == ExpressionType.MemberAccess) 
      { 
       var memExp = exp.Operand as MemberExpression; 
       if (memExp != null) 
       { 
        return memExp.Member.Name; 
       } 
      } 
     } 
     return string.Empty; 
    } 

希望这些代码可以帮助您