1

実際、私は1日中外部キーのEntityFrameworkに費やしています。2つのテーブルがあると仮定します。Process(app_id、process_id)LookupProcessId(process_id、process_description)

名前が付いた2つのテーブルを理解できます。最初のテーブルは、process_idを使用してすべてのアプリケーションを示し、説明はseoncdテーブルにあります。実際、私は何度も試して、クエリを実行する方法を理解しています。

Dim result = (from x in db.Processes where x.LookupProcess is (from m in db.LookupProcessIds where descr = "example" select m).FirstOrDefault() select x).FirstOrDefault()

最初に聞きたいのは、それを行う簡単な方法があるかどうかです。

次に質問したいのは挿入についてです

 p As New AmpApplication.CUEngData.Process
    p.app_id=100
    p.LookupProcess = (from m in db.LookupProcessIds where descr = "example" select m).FirstOrDefault()
 db.AddToProcesses(p)
 db.SaveChanges()

外観からは問題ないように見えますが、「AmpCUEngEntities.Processes」のエンティティが「FK_Process_LookupProcess」関係に参加しているというエラーが表示されます。関連する「LookupProcess」が0個見つかりました。1「LookupProcess」が必要です。

挿入が間違っているのでしょうか?それは私のクエリが正しいですか?

4

3 に答える 3

0

最初の質問については、@jeroenh が提案したことをさらに詳しく説明します。

Dim result = (from x in db.Processes.Include("LookupProcess")  
    where x.LookupProcess.descr = "example"  
    select x).FirstOrDefault()

Includeステートメントを追加すると、LookupProcessエンティティがハイドレートされ、クエリを実行できるようになります。がなければ、Includenullx.LookupProcessになり、エラーが発生した理由を説明する可能性があります。

リテラル文字列を引数として使用するのIncludeが理想的でない場合は、ネストされたエンティティを使用してこれを行う例について、「クエリから推測できません」というエラーなしで DbSet 3 テーブルから返すを参照してください。

2 番目の質問については、この行

p.LookupProcess = (from m in db.LookupProcessIds
    where descr = "example" select m).FirstOrDefault()

「例」LookupProcessIdの aがない場合、 を取得するため、後で問題が発生する可能性があります。MSDNから:process_descriptionnull

参照型と null 許容型の既定値は null です。

このためp.LookupProcess、エンティティを挿入するときに null の場合、例外が発生します。

「AmpCUEngEntities.Processes」のエンティティは、「FK_Process_LookupProcess」関係に参加します。0 件の関連する 'LookupProcess' が見つかりました。1 'LookupProcess' が必要です。

この種の問題を回避するp.LookupProcessには、データベースに入れる前に が null でないことを確認する必要があります。

If Not p.LookupProcess Is Nothing Then 
    db.AddToProcesses(p)        
    db.SaveChanges()        
End If 
于 2012-10-15T10:36:18.270 に答える
0

実際、DataEntityModel とそのフレームワークのいくつかの概念を見逃していました。データを操作するには、コンテキストの観点からオブジェクトを呼び出す必要があります。これらを使用すると、DataObject の状態を ObjectStateManager に指定できます。あなたの場合、FK からの依存データがある場合は、リンクされたデータをリーフからルートに追加/更新する必要があります。

この例は、単純な (依存関係のない) データ操作を示しています。存在する場合は選択し、挿入または更新します。

ObjectStateManager 操作の詳細については、http://msdn.microsoft.com/en-us/library/bb156104.aspx を参照してください。

    Dim context As New Processing_context 'deseign your context (this one is linked to a DB)

    Dim pro = (From r In context.PROCESS
                    Where r.LOOKUPPROCESS.descr = LookupProcess.descr
                    Select r).FirstOrDefault()

    If pro Is Nothing Then 'add a new one
        pro = New context.PROCESS With {.AP_ID = "id", .PROCESS_ID = "p_id"}

        context.PROCESS.Attach(pro)
        context.ObjectStateManager.ChangeObjectState(pro, System.Data.EntityState.Added)
    Else
        'update data attibutes
        pro.AP_ID = "id"
        pro.PROCESS_ID = "p_id"

        context.ObjectStateManager.ChangeObjectState(pro, System.Data.EntityState.Modified)
        'context.PROCESS.Attach(pro)
    End If

    context.SaveChanges()

これが役立つことを願っています。良い1日を!

于 2012-10-12T14:11:13.037 に答える
0

最初の質問:

 Dim result = (from x in db.Processes 
               where x.LookupProcess.descr = "example" 
               select x).FirstOrDefault()
于 2012-09-28T06:02:07.917 に答える