0

これは私が解決しようとしている問題の単純化されたバージョンです:

2つのエンティティがあります:

アイテム

ItemID(PK)

その他の単純なプロパティ...

WorkItem(ナビゲーションプロパティ)

WorkItem

ItemID(PK)

その他の単純なプロパティ...

アイテム(ナビゲーションプロパティ)

 

アイテムとそのワークアイテムを作成する必要があります。また、保存する前に、2つのエンティティが相互にポイントできるように両方のナビゲーションプロパティを設定する必要があります。

これは私ができることです:

  Item newItem = Item.CreateItem(0, blah,blah,blah);
  service.AddToItems(newItem);


  WorkItem newWorkItem = new WorkItem();           
  service.AddToWorkItems(newWorkItem);

  //set the navigation properties
  newItem.WorkItem = newWorkItem;
  newWorkItem.Item = newItem;

残念ながら、保存に関しては、これは失敗します。EFは、WorkItemのアイテムの関連付けを設定しようとすると、WorkItemの主キーを設定しようとすると思います。

誰かがこれを達成するための正しい方法について私に教えてもらえますか?

 
更新:  
 
それで、私は継承を使用してモデルを構築しようとしました。モデルが構築され、検証されます。

残念ながら、モデルにWCFデータサービスを追加し、ブラウザーでサービスを表示しようとすると、次のようになります。

  ..... <m:message xml:lang="en-US">An error occurred while processing this request.    </m:message>
<m:innererror>
  <m:message>Navigation Properties are not supported on derived entity types. Entity Set 'app_Items' has a instance of type 'tempmodel.app_CostItem', which is an derived entity type and has navigation properties. Please remove all the navigation properties from type 'tempmodel.app_CostItem'.</m:message>
  <m:type>System.InvalidOperationException</m:type>
  <m:stacktrace>   at System.Data.Services.Serializers.SyndicationSerializer.WriteObjectProperties(IExpandedResult expanded, ......

CostItemは、Itemから派生するWorkItemのような別のエンティティです。

4

2 に答える 2

0

あなたが与えた例に基づいて、私はあなたが継承を使うべきだと信じています。WorkItemエンティティはItemエンティティから継承する必要があります。次に、コードでは、WorkItemエンティティのみを操作する必要があり、Itemエンティティのすべてのプロパティも含まれます。さらに、WorkItemエンティティはItemエンティティのキ​​ーを使用します。

于 2012-03-15T12:26:00.680 に答える
0

クライアント側の部分的な「サブ」クラスのそれぞれにダミープロパティを作成するようになりました。

    private Item _BaseItem;
    [AtomIgnore]
    internal Item BaseItem
        {
        get
            {
            if (_BaseItem != null)
                return _BaseItem;
            else
                return this.Item;                
            }
        set
            {
            _BaseItem = value;
            OnPropertyChanged("Item");
            }
        }

クライアント側のコードは、このBaseItemプロパティを使用して、オブジェクトグラフを逆にトラバースします。したがって、関係を設定するコードは次のようになります。

 Item newItem = Item.CreateItem(0, blah,blah,blah);
 service.AddToItems(newItem);


 WorkItem newWorkItem = new WorkItem();           
 service.AddToWorkItems(newWorkItem);

 //set the navigation properties
 newItem.WorkItem = newWorkItem;
 newWorkItem.**BaseItem** = newItem;

BaseItemプロパティは内部で宣言されていることに注意してください。これは、シリアライザーがプロパティをシリアル化してサーバーに送信しようとしないようにするためです。

[AtomIgnore]は、DataServiceContext.WritingEntityのハンドラーで作成して検索する属性です。ハンドラーは、サーバーに送信される前に、この属性でマークされたプロパティを取り除きます。ただし、プロパティがrefタイプの場合、この手法は機能しないようです。したがって、internalを使用します。

内部として宣言することは、XAMLからバインドできないことも意味します。幸い、回避策が簡単であるように、いくつかのプロパティにバインドするだけで済みました。

于 2012-03-21T11:31:26.520 に答える