C# 实体框架更新一个父实体更新另一个父实体
我不熟悉实体框架。我有一个SupplyItem实体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
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;
}
}
}
返回字符串。空;
}
希望这些代码可以帮助你