0

1 対多の関係が設定されています。(例: 多くの電話番号を持つ人)。私のgetクエリthis.ObjectContext.Person.Include("PhoneNumbers")では、生成されたMetaDataを含めpublic EntityCollection<PhoneNumbers> PhoneNumbers{ get; set; }、これと必要なその他のプロパティでDTOを設定しました。

[Include]
[Association("Name","thisKey","otherKey")]
public IEnumerable<PhoneNumbers> PNums { get; set; }

すべてのデータを正常に取得して Silverlight で表示できますが、新しいデータを作成すると問題が発生します。私はこの種のことが起こっています:

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{

   if (dgMMs.SelectedItem != null)
   {
      PhoneNumbers wb = new PhoneNumbers ();
      wb.this = tbThis.Text;
      wb.that =  tbThat.Text;
      wb.other = tbOther.Text;
      wb.whatnot = tbwhatnot.Text;
      ((Person)dgMMs.SelectedItem).PNums.Add(wb);
   }
}

次に、呼び出し時にこのエラーが発生しますTDataSource.SubmitChanges();

Message = "送信操作の検証に失敗しました。詳細については、EntitiesInError 内の各エンティティの Entity.ValidationErrors を調べてください。"

わかりました、それで、確かにエラーがありますが、なぜそこにあるのかよくわかりません。私はそれを作成してentityCollectionに追加したときに設定しなかったlast_modified_byフィールドのデータベースにnull不可のフィールドを持っています。これが原因だと思いますが、私の質問はなぜRIAがそうしないのかそのフィールドをそこに設定したいので、作成したサービスで Insert メソッドを呼び出します。そのようです:

public void InsertPhoneNumber(PhoneNumbers pnum)
{
   pnum.last_modified = DateTime.Today;
   pnum.last_modified_by = Thread.CurrentPrincipal.Identity.Name;
   if ((pnum.EntityState != EntityState.Detached))
   {
      this.ObjectContext.ObjectStateManager.ChangeObjectState(pnum, EntityState.Added);
   }
   else
   {
      this.ObjectContext.PhoneNumbers.AddObject(pnum);
   }
}

しかし、RIA が私のオブジェクトを追加し、独自の Insert メソッドを呼び出すようなものです。そのため、最初はそれを使用して、UI でプロパティを設定しただけで、次のエラーが発生しました。

Message = "送信操作に失敗しました。エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。内部例外メッセージ: IDENTITY_INSERT が OFF に設定されている場合、テーブル 'iset_trkr_writeback' の ID 列に明示的な値を挿入できません。"

私は ID フィールドを何も設定しませんでした。RIA がこれをやってくれると思っていました。しかし、デバッグして見てみると、値が 0 になっています。しかし、少なくとも今回は、サービスで挿入メソッドを呼び出します...プロセスに大きな何かが欠けているのかもしれませんが、本当に助けが必要です。ありがとう:)

4

1 に答える 1

0

Entity Frameworkを使用していますか?その場合、メタデータの少なくとも1つのフィールドに[Key]属性が必要です。または、ID / PK列(int / guid)を作成してから、メタデータを更新します。

于 2010-08-16T18:36:54.000 に答える