분리 POCO 시나리오 (업데이트 전에 DB에서 사용자를로드 할 수 없습니다) :
당신은 선택적 속성을 업데이트해야하는 말할 수있다 :
는
public User Save(User user)
{
if (user.UserId == 0)
{
context.Users.AddObject(user);
}
else
{
context.Users.Attach(user);
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(user);
entry.SetModifiedProperty("Email");
}
context.SaveChanges();
return user;
}
또한 두 가지를 만들 수 있습니다 과부하가 걸리는 Save
방법입니다.
public User Save(User user)
{
if (user.UserId == 0)
{
context.Users.AddObject(user);
}
else
{
context.Users.Attach(user);
context.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);
}
context.SaveChanges();
return user;
}
public User Save(User user, IEnumerable<Expression<Func<User, object>>> properties)
{
if (user.UserId == 0)
{
context.Users.AddObject(user);
}
else
{
context.Users.Attach(user);
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(user);
foreach(var selector in properties)
{
string propertyName = PropertyToString(selector.Body);
entry.SetModifiedProperty(propertyName);
}
}
context.SaveChanges();
return user;
}
// Doesn't work for navigation properties!
private static string PropertyToString(Expression selector)
{
if (selector.NodeType == ExpressionType.MemberAccess)
{
return ((selector as MemberExpression).Member as PropertyInfo).Name;
}
throw new InvalidOperationException();
}
두 번째 오버로드 이런 식으로 호출합니다 : 첫 번째는 두 번째 명시 적으로 선택 속성을 업데이트합니다, 전체 개체를 업데이트합니다
userRepository.Save(user, new List<Expression<Func<User, object>>>
{
u => u.Email
});
첨부 시나리오 (업데이트 전에 DB에서 사용자를로드합니다) :
이 업데이트를 수행하는 방법을 제어 할 수 있도록 위임을 받아 들일 당신의 저장 방법을 수정할 수 있습니다
을 당신은 확실히 대린의 게시물 및 업데이트에 대한 특별 ModelViews에 대해 생각해야 내 사례에도 불구하고,
var user = GetUpdatedUserFromSomewhere();
repository.Save(user, (dbUser, mergedUser) =>
{
dbUser.Email = mergedUser.Email;
});
어쨌든 :
public User Save(User user, Action<User, User> updateStrategy)
{
if (user.UserId > 0)
{
User dbUser = context.Users.FirstOrDefault(u => u.UserId == user.UserId);
updateStrategy(dbUser, user);
}
else
{
// New object - all properties should be saved
context.Users.AddObject(user);
}
context.SaveChanges();
return user;
}
당신은 방법이 방법을 호출합니다.
명시 적으로 개체를 업데이트하는 필드의 경우 왜 PropertyToString은 bool에서 작동하지 않습니까? –
그 updateStrategy는 아름다움의 것입니다. 그것을 사랑해! 지금 저장소의 업데이트 메소드에이를 사용하고 있습니다. 호출 코드는 무엇을 업데이트해야하는지, 어떻게 업데이트 할지를 결정합니다. – Jez