0

SubmitChanges を呼び出して、RIA エンティティの 1 つに変更を送信しています。このエンティティには、アイテムの ObservableCollection であるプロパティを持つプロパティがあります。

私が行った唯一の変更は、このリストにエントリを追加したことです。

Submit changes を呼び出す前に count プロパティを確認すると、正しいカウントです。6 としましょう。SubmitChanges を呼び出した後、クライアント側のカウントは 1 です。リストには、新しく追加されたアイテムのみが含まれ、以前に存在したアイテムは含まれません。

サーバー上では、操作は 6 つのアイテムすべてがそこにあることを示しており、Fiddler を使用して、6 つのアイテムすべてがクライアントに返されていることを確認しました。

ただし、アプリケーションで実行するコードの次の行では、このリストのカウントは 1 (または新しく追加されたアイテムの数) です。

すべてのアイテムが適切に存在すること、および新しい DomainContext を作成してデータをリロードすると、リスト内のすべてのアイテム (追加したアイテムも含む) が存在することを確認しました。

この動作の原因について何か考えはありますか? これらのアイテムはどこかに失われています。

問題のオブジェクトと、エントリを失っている ObservableCollection を次に示します。

[DataContract(Name = "CT", Namespace = "http://domain/properties")]
public class ChoicePropertyType : PropertyType
{
    [DataMember(Name = "C")]
    public bool IsCustomValueAllowed { get; set; }

    [DataMember(Name = "A")]
    public bool AllowMultiple { get; set; }        

    private ObservableCollection<ValidValue> _defaultValues;

          [Association("DefaultValues", "Id", "ParentId")]
    [Include]
    [Composition]
    [DataMember(Name = "D")]
    public ObservableCollection<ValidValue> DefaultValues
    {
        get
        {
            if (_defaultValues == null)
                _defaultValues = new ObservableCollection<ValidValue>();
            return _defaultValues;
        }
    }

}

[KnownType(typeof(ChoicePropertyType))]
[KnownType(typeof(DatePropertyType))]
[KnownType(typeof(NumberPropertyType))]
[KnownType(typeof(TextPropertyType))]
[KnownType(typeof(UserPropertyType))]
[DataContract(Name = "PT", Namespace = "http://domain/properties")]
public class PropertyType
{
    [Key]
    [DataMember(Name = "I")]
    public string Id { get; set; }

    [DataMember(Name = "P")]
    public int? ParentId { get; set; }

    [DataMember(Name = "R")]
    public bool IsRequired { get; set; }

    [DataMember(Name = "H")]
    public bool HasDefaultValue { get; set; }
}
4

1 に答える 1

0

RIA エンティティのメタデータには、リスト プロパティを装飾する [Include] 属性が必要だと思います。さらに、その List が他のエンティティを表す場合、実際には EntityCollection である必要があります。

インクルードの 1 つの問題は、Ria エンティティを照会するたびに、リスト内の関連項目 (すべて) も返されることです。ただし、インクルードが使用されていない場合は、最初に別の Load 呼び出しを介してドメイン コンテキストに関連するアイテムをロードする必要があります。

つまり、リスト内のすべての関連アイテムをドメイン コンテキストでロードするクエリを実行する必要があり、その後、ria エンティティはリスト内のアイテムと適切な関係を持つことになります。

さらに、アイテムを ria エンティティのリストに追加することは、実際には正しい方法ではありません。まず、ria エンティティがまだ存在しない場合は、コンテキストに追加します。次に、関連するエンティティをコンテキストに追加します。最後に、関連エンティティの ria エンティティ リンクを介して 2 つを結合し、変更を保存します。

例:

ria エンティティをドメイン コンテキストに追加または取得します。関連するエンティティを作成する 関連するエンティティ.ria エンティティ参照リンク = ria エンティティ; 関連エンティティをコンテキストに追加します。変更内容を保存。

于 2012-11-21T00:08:23.117 に答える