0

我在页面上有一个复杂的表单,该表单绑定到代表一个相当复杂的实体的 POCO。要求之一是,在模糊时,我更新数据库。

我目前正在通过 ajax 传递属性(作为键)、值和 CampaignId。密钥可能类似于:Campaign.FanSettings.SocialSharing.FacebookLinkText.

我正在使用下面的代码,并获得“关闭”。我的最后一个 propertyToSet 是 FacebookLinkText 没有被设置,因为我object source的类型是 Entities.Campaign,而我object value的只是一个字符串。我知道这些需要是相同的类型,但我不明白该怎么做。两个问题:

  1. 如何修改下面的代码才能执行 propertyToSet.SetValue 方法
  2. 由于我将它转换为一个对象,我看不到它实际上会如何更新我的实体,所以当我调用 SaveChanges 时,它会适当地更新。我错过了什么?

谢谢!

代码:

    public void UpdateCampaign(int id, string key, string value)
    {
        using (var context = new BetaEntities())
        {
            var camp = context.Campaigns.Where(e => e.Id == id).Single();
            SetProperty(camp, key,value);
        }
    }
    public void SetProperty(object source, string property, object value)
    {
        string[] bits = property.Split('.');
        for (int i = 0; i < bits.Length - 1; i++)
        {
            PropertyInfo prop = source.GetType().GetProperty(bits[i]);
            source = prop.GetValue(source, null);
        }
        PropertyInfo propertyToSet = null;
        if (source is IEnumerable)
        {
            foreach (object o in (source as IEnumerable))
            {
                 propertyToSet = o.GetType().GetProperty(bits[bits.Length - 1]);
                 break;
            }
        }
        else
        {
            propertyToSet = source.GetType().GetProperty(bits[bits.Length - 1]);
        }
        propertyToSet.SetValue(source, value, null);
    }
4

1 回答 1

0

解决了。

public void UpdateCampaign(int id, string key, string value)
    {
        using (var context = new BetaEntities())
        {
            var camp = context.Campaigns.Where(e => e.Id == id).Single();
            SetProperty(camp, key, value);
            context.SaveChanges()
        }
    }
    public void SetProperty(object source, string property, object value)
    {
        string[] bits = property.Split('.');
        for (int i = 0; i < bits.Length - 1; i++)
        {
            PropertyInfo prop = source.GetType().GetProperty(bits[i]);
            source = prop.GetValue(source, null);
        }
        PropertyInfo propertyToSet = null;
        if (source is IEnumerable)
        {
            foreach (object o in (source as IEnumerable))
            {
                 propertyToSet = o.GetType().GetProperty(bits[bits.Length - 1]);
                 propertyToSet.SetValue(o, value,null);
                 break;
            }
        }
        else
        {
            propertyToSet = source.GetType().GetProperty(bits[bits.Length - 1]);
            propertyToSet.SetValue(source, value, null);
        }
    }
于 2012-11-19T23:21:50.580 回答