2

次のデータモデルがあります。

ここに画像の説明を入力

新しいレポートの追加をサポートする必要がある WCF サービスを作成しています。

 public bool CreateNewReport(Report report)
    {
        MyEntities context = new MyEntities();
        context.AddToReports(Report);
        context.SaveChanges();
    }

したがって、私のメソッドは、クライアントで作成されたレポート オブジェクトを取得し、データ コンテキストを介してデータベースに追加します。(すべてのメンバーが DataContract に含まれています)

私の質問は、ナビゲーション プロパティに関するものです。

  1. クライアントもユーザー オブジェクトを作成し、それを送信する前に新しいレポート オブジェクトに入れる必要がありますか?
  2. これにアプローチする最良の方法は何ですか? 私が考える1つの方法は、UserIdフィールドを追加することですReportEntity
  3. 新しいレポートが挿入されたときに、新しい Report で UserEntity Report nav プロパティを更新するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

データベースをインポートする場合は、ナビゲーション プロパティ (画像のプロパティ) と外部 ID プロパティ (たとえば、レポート クラスに User および UserID プロパティがあります) を生成します。このようにして、クライアントで UserID を設定し、それをサーバーに送信して追加できますAddToReports... ユーザー オブジェクト全体を送信する場合は、それをエンティティ コンテキストに添付する必要があります。そうしないと、ユーザーがもう一度作成されます...

参照されたユーザーをアタッチします: (ただし、ID のみでユーザーを送信することをお勧めします)

public bool CreateNewReport(Report report)
{
    using (MyEntities context = new MyEntities())
    {
         context.AddToReports(Report);
         context.Users.Attach(report.User);
         context.SaveChanges();
    }
}

ユーザーのレポートを変更するには:

public bool ChangeUserToNewReport(int userid, Report newReport)
{
    using (MyEntities context = new MyEntities())
    {
         var user = context.Users.Single(u => u.ID = userid);
         user.Report = newReport;
         context.SaveChanges();
    }
}

既存のレポートの場合:

public bool ChangeUserReport(int userid, Report existingReport)
{
    using (MyEntities context = new MyEntities())
    {
         context.Reports.Attach(existingReport);
         var user = context.Users.Single(u => u.ID = userid);
         user.Report = existingReport;
         context.SaveChanges();
    }
}

これは、モデルがどのように見えるべきかのサンプルです。関連線をダブルクリックして、ダイアログを開きます。PersonPersonIDプロパティが同じであることがわかります。このようにモデルを作成すると、VS は正しい SQL を生成するはずです。 ここに画像の説明を入力

于 2012-04-06T10:54:50.000 に答える