Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架更新一个父实体更新另一个父实体_C#_Entity Framework_Entity Framework 4 - Fatal编程技术网

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

C# 实体框架更新一个父实体更新另一个父实体,c#,entity-framework,entity-framework-4,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

我不熟悉实体框架。我有一个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对象时,它正确地添加了product和IsPublic属性。像这样,我为supplyitem实体添加了两个对象,这两个对象都引用同一个产品

现在,我更改了supplyitem实体的第二个对象的isPublic属性,并按如下方式更新该实体

     UnitOfWork.Context.Entry(supplyItem1).State = EntityState.Modified;
在代码行上方,正确更新isPublic属性,但它会为引用同一产品的supplyitem实体的另一个对象生成null Product

我不理解这种行为。任何指针都会非常有用!
谢谢。

嗯,当您更新时,您不会从数据库中读取,您需要新建一个SupplyItem并设置id,设置IsPublic并保存,因此您新建它的对象,产品属性为默认值(null)
执行这些操作时,整个对象(每个属性)都会更新。 所以如果你想更新部分字段,你应该这样做

var entry = db.Entry(entity);
if (entry.State == EntityState.Detached)
{
    db.Set<TEntity>().Attach(entity);
}
entry.Property("propertyName").IsModified = true
var entry=db.entry(实体);
if(entry.State==EntityState.Detached)
{
db.Set().Attach(实体);
}
entry.Property(“propertyName”).IsModified=true
propertyName是一个字符串,它必须与属性的名称相同 你可以用lamda来做这件事

Update<TEntity>(TEntity entity, params Expression<Func<TEntity, object>>[] updateProperty)
Update(tenty实体,参数表达式[]updateProperty)
因此,在函数中,需要从表达式中找到PropertyName

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;
    }
公共静态字符串GetExpressionText(表达式ex)
{
if(ex.Body.NodeType==ExpressionType.MemberAccess)
{
var memExp=作为MemberExpression的主体;
if(memExp!=null)
{
返回memExp.Member.Name;
}
}
else if(ex.Body.NodeType==ExpressionType.Convert)
{
var exp=作为一元表达式的主体;
返回GetExpressionText(exp);
}
返回字符串。空;
}
公共静态字符串GetExpressionText(UnaryExpression)
{
如果(exp!=null)
{
if(exp.Operand.NodeType==ExpressionType.MemberAccess)
{
var memExp=exp.操作数作为MemberExpression;
if(memExp!=null)
{
返回memExp.Member.Name;
}
}
}
返回字符串。空;
}
希望这些代码可以帮助你