2011-01-10 13 views
0

データベースには2つのテーブルがあります。
Article:ID |タイトル|セクションID:
セクション:ID | SectionName
(すべてのidsをIDインクリメントとして設定)外部キーを持つEntityオブジェクトを追加する

(データベースに存在する)特定のセクションIDを持つ新しい記事を追加したいと思います。

私は疲れてこの:

Article art = new Article 
{ 
    Title = "title" 
}; 

art.Section.SectionID = 0; 


if (art.EntityState == EntityState.Detached) 
{ 
    Articlerctx.AddToArticles(art); 
} 

私は= 0 art.Section.SectionID上のエラーを取得します。オブジェクト

の インスタンスに設定されていない

オブジェクト参照は、私はちょうど1つのint型のフィールドのための完全なオブジェクトを作成する必要がありますか?

答えて

0

もちろん、データベースからオブジェクトを取得することはできます(「データベースに存在する」は表示されませんでした)。

あなたのコンテキストからSectionオブジェクトを取得して割り当てます。 EF 4では

art.Section = context.Section.FirstOrDefault(s => s.ID == 0); 
+0

データベースへの別の往復 – asker

+0

とにかく、エンティティへのLinqはSingleOrDefaultをサポートしておらず、FirstOrDefaultを使用する必要があります。 – asker

+0

うん、あなたはこの方法で正しいです。パフォーマンス:私は少なくとも私のプロジェクトでそれを感じなかった。また、厳密に型指定されたオブジェクトの利点があります。エンティティ・キーを自分で作成すると、エラーの可能性が減ります。 – Femaref

0
art.SectionReference.EntityKey = new EntityKey("EntityModelName.EntitySetName", "IdFieldName", 0); 
+1

私はPOCOを使用していないという問題の例を理解していますが、これはPOCOで動作しないことに注意する価値があると思います。 –

+0

セクションIDがよく知られており、いつでもすぐに変更されない場合は、このパターンを列挙型で行います。 (int)SectionId.Introduction。これにより、マジックナンバーが減少し、明瞭度が向上します。ただし、アプリケーションでセクションを変更できる場合は、これを行わないでください。 –

+0

弱いタイプの私はこれが好きではない – asker

0

あなたは、モデル内の外部キーフィールドを含めるように更新モデルウィザードのボックスをチェックすることができます。これを行うと、コードを次のように変更できます。

Article art = new Article 
{ 
    Title = "title" 
}; 

art.SectionID = 0; 

if (art.EntityState == EntityState.Detached) 
{ 
    Articlerctx.AddToArticles(art); 
} 
+0

ありがとう、私はEF 3を使用しています – asker

関連する問題