4

JSON応答を返すRESTfulAPIにWCFDataServicesを使用しています。

このオブジェクトを検討してください:

[Table("person")]
public class Person
{
    [Column("dob", TypeName = "datetime")]
    public DateTime DateOfBirth { get; set; }

    [NotMapped]
    public int Age
    {
        get { return CalculateAge(); }
        set { }
    }
}

WCFは、私が期待するようにこのオブジェクトを処理しません。私のサービスリクエストは、Personオブジェクトのシリアル化でAgeプロパティを完全に無視します。

Ageプロパティをダミーのデータベース列にマップし、何もしないセッターを作成するという回避策を使用しています。なんて醜いハック!データベース列にマップされていないプロパティをDataServiceに返すためのより良い方法はありますか?

4

4 に答える 4

4

多くの調査を経て、stackoverflowに反する証拠がないので、答えは次のようになります。いいえ。EntityFramework4を使用してマップされたエンティティを持つWCF DataServiceは、マップされていないプロパティを返すことはできません。

私が使用している醜いハックはこれです。これは、データベース内に、決して読み取られないフィールドを実際に作成する必要があります。

[Table("person")]
public class Person
{
    [Column("dob", TypeName = "datetime")]
    public DateTime DateOfBirth { get; set; }

    [Column("dummy1", TypeName = "int")]
    public int Age
    {
        get { return CalculateAge(); }
        set { }
    }
}
于 2012-02-09T02:46:36.037 に答える
2

tyrongowerが述べているのと同様に、これらの状況で私が使用したものは次のとおりです。

注:これは、JSONだけでなくWCFとRESTWCFでも機能します

[DataContract]
public class Submission
{
    [NotMapped]
    [DataMember]
    public string Location
    {
        get { return ""; }
        set { }
    }
}
于 2012-08-22T17:52:14.360 に答える
1

System.Runtime.Serialization属性は、WCFが参照するものであるため、使用する必要がある場合があります。

ただし、データコントラクトにロジックを含めることができるかどうかはわかりません。

[Table("person")]
[DataContract]
public class Person
{
    [Column("dob", TypeName = "datetime")]
    [DataMember]
    public DateTime DateOfBirth { get; set; }

    [NotMapped]
    [DataMember]
    public int Age
    {
        get { return CalculateAge(); }
    }
}

編集:

プライベートセッターが必要な場合があります(Silverlight対応のWCFサービスのget-onlyプロパティをどのように構成しますか

于 2012-02-03T00:36:22.937 に答える
0

私もこの問題にぶつかり、拡張メソッドを使用することにしました。例えば:

public static class PersonExtensions
{
    public static int GetAge(this Person person)
    {
        // your CalculateAge logic (simplified)
        return (DateTime.Now - person.DateOfBirth).TotalDays / 365;
    }
}

次に、DataServicesコンシューマーで、次のことができます。

person.GetAge()

ええ、それはそれほど良くperson.Ageはありませんが、不要なデータベース列を追加することもありません。

アップデート:

もう1つの方法は、サービス参照に含まれるPersonクラスを拡張することです。これを行うには、サービス参照のPersonクラスと同じ名前空間を持つ部分的なPersonクラスを作成します。例えば:

public partial class Person
{
    public string int Age
    {
        get { return (DateTime.Now - this.DateOfBirth).TotalDays / 365; }
    }
}

次に、DataServices PersonモデルにAgeプロパティがあります!

于 2012-03-14T21:57:10.967 に答える