我是实体框架的新手。我有一个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实体添加了两个对象,两个对象都引用相同的产品。
现在,我为supplyitem实体的第二个对象更改了isPublic属性,并像这样更新实体
UnitOfWork.Context.Entry(supplyItem1).State = EntityState.Modified;
在上面的代码行中,正确更新了isPublic属性,但它为另一个引用同一产品的supplyitem实体对象生成了null Product。
我不明白这种行为。任何指针都会非常有用! 感谢。
答案 0 :(得分:1)
var entry = db.Entry(entity);
if (entry.State == EntityState.Detached)
{
db.Set<TEntity>().Attach(entity);
}
entry.Property("propertyName").IsModified = true
propertyName是一个字符串,它必须与属性的Name相同 你可以用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;
}
希望这些代码可以帮助您