1

1対多の関係を持つ2つの単純なモデルがあります

public class X{
  public int id {get;set;}
  public virtual Y y{ get; set; }
  public string description{get;set;}
}
public class Y{
  public int id{get;set;}
  public string name{get;set;}
}

そしてエンティティフレームワークから私は関係を設定します

既存の値で新しいXレコードを作成するフォームを送信しようとしていますY

フォームからアクションに返されるデータはstring descriptionandy_idです。

パラメータからオブジェクトを指定しようとしたときのアクションについて

public ActionResult sth(X x){}

これx.yはnullに設定されています(これは予想されます...)が、次のことを試したとき...

x.y = (from i in Y where i.id == that_id select i).first(); 
...
db.saveChanges();

エンティティ フレームワークが新しいYレコードをデータベースに挿入しました ...

私は何か間違ったことをしていることを知っています...あなたの助けは非常に高く評価されます!

4

2 に答える 2

5

コードを見ると、x と y の ID と x の仮想 Y があります。この仮想 Y in x に加えて、y の ID への参照も必要になります。y 内の x の仮想 ICollection と共に。

public class X{
  public int x_id {get;set;}
  public int y_id {get;set}
  public virtual Y y{ get; set; }
  public string description{get;set;}
}
public class Y{
  public int y_id{get;set;}
  public string name{get;set;}
  public virtual ICollection<X> X {get;set;}
}

これは、エンティティの関係に役立ちます。フォームのドロップダウンから y 値を選択していない限り、フォームを担当するコントローラに y(s) のリストを渡すこともできます。

于 2012-12-20T09:36:43.227 に答える
1

dbContext での Y オブジェクトの追跡に問題があるようです。linqでクエリするコレクションYをどのように生成していますか? dbContext を使用してデータベースからフェッチしますか? または他のソースから?

そうでない場合は、適切に追跡できるように、コンテキストを使用するか、Attach() 関数を使用してフェッチする必要があります。

別の質問がポップアップします。新しい Y が挿入されるのはなぜですか? データベースに主キーが定義されていませんか? または、挿入しようとすると例外がスローされますか?

以上が私の考えです。

于 2012-12-23T09:38:05.960 に答える