0

かなり複雑なエンティティを表すPOCOにバインドされたページに複雑なフォームがあります。要件の1つは、ぼかし時にデータベースを更新することです。

現在、プロパティ(キーとして)、値、およびCampaignIdをajax経由で渡しています。キーは次のようになりますCampaign.FanSettings.SocialSharing.FacebookLinkText

私は以下のコードを使用していて、「近づいています」。私の最後のpropertyToSetは、FacebookLinkTextが設定されていないことです。これobject sourceは、タイプがEntities.Campaignであるのに対し、私object valueは単なる文字列であるためです。これらは同じタイプである必要があることは理解していますが、その方法がわかりません。2つの質問:

  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 に答える