实体框架更新一个父实体更新另一个父实体

时间:2014-01-06 09:43:45

标签: c# entity-framework entity-framework-4

我是实体框架的新手。我有一个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。

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

1 个答案:

答案 0 :(得分:1)

呃,当你更新时,你不是从db读取的,你是新的一个SupplyItem并设置id,设置IsPublic,并保存,所以你新建它的对象,Product属性是默认的(null)
当你这样做时,整个对象(每个属性)都会更新。 所以如果你想要更新字段的部分,你应该这样做

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;
    }

希望这些代码可以帮助您