RavenDB - 当传递给save-method的属性可以是任何属性时,将单个属性更新为db

时间:2014-09-08 08:09:02

标签: c# ravendb

我知道在知道我需要更新哪个属性时可以将单个属性保存到我的数据库中,这样(方法SaveContent通过视图中的AJAX帖子触发):

public void SaveContent(string contentToUpdate)
{
    var page = Session.Load<CorePage>("CorePages/1");

    page.Title = contentToUpdate;
    RavenSession.SaveChanges();
}

但我的问题是:传递给我的Save-method的(string contentToUpdate) - 参数可以是我的视图@mode-class中的任何属性值,因为我在同一个视图中的许多地方使用WYSIWYG编辑器意味着我永远不知道传递给string contentToUpdate的属性。所以我不能使用我的第一个例子中显示的代码类型。

string contentToUpdate可以是以下任何一种:

public class CorePage
{
    public string WelcomeHeader { get; set; }
    public string WelcomeText { get; set; }
    public string LongText { get; set; }
    public string ShortDescription { get; set; }
}

那么:当page = Session.Load<CorePage>("CorePages/1"); - 参数可以是任何时,如何更新var string contentToUpdate中的单个属性?还有哪些其他参数可能需要传递给save-method来解决这个问题(propertyName)?

编辑:

我不需要创建新属性,我需要找到女巫属性来设置值。 因此,通过将propertyName作为参数传递给我的save-method,我需要使用该值(可能是我的类CorePage中的任何属性)来更新该匹配属性。 基本上,我从来不知道我public class CorePage的财产被发送到public void SaveContent

看看下面的内容,你可以清楚地知道我的意思:

 public void SaveContent(string propertyName, string contentToUpdate)
 {
     //Philip Kendalls method used here
     SaveContent(page => page.propertyName, contentToUpdate);
 }

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要更新四个属性WelcomeHeaderWelcomeTextLongTextShortDescription中的一个。您可以稍微使用expression trees

来完成此操作
public void SaveContent(Expression<Func<CorePage, string>> propertyToSet, string contentToUpdate)
{
    var page = Session.Load<CorePage>("CorePages/1");
    var memberExpression = (MemberExpression) propertyToSet.Body;
    var property = (PropertyInfo) memberExpression.Member;
    property.SetValue(page, contentToSet);
    RavenSession.SaveChanges();
}

然后将其称为SaveContent(page => page.WelcomeHeader, "Welcome along!")