【问题标题】:entity framework update one parent entity updates another parent entity实体框架 更新一个父实体 更新另一个父实体
【发布时间】:2014-01-06 09:43:45
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    呃,当你更新时,你不是从数据库中读取的,你新建一个 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 是一个字符串,它必须与 property 的 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;
        }
    

    希望这些代码可以帮助到你

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 2021-02-19
      • 2013-07-24
      相关资源
      最近更新 更多