2011-04-20 16 views
1

私はこの自己追跡POCO

var prof = new Profile(){ ID = 1, Enabled = false }; 
context.Profiles.Single (s => s.ID == 1); 
context.Profiles.ApplyCurrentValues(prof); 
context.SaveChanges(); 

SQLは説明がNULLを許可しないことを私に言いますが、私はありませんように更新しようとすると、私はこの

public Profile 
{ 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    public virtual string Description 
    { 
     get; 
     set; 
    } 

    public virtual bool Enabled 
    { 
     get; 
     set; 
    } 
} 

のようなPOCOクラスを持っています「Description」列を更新して、「Enabled」フィールドだけを更新したいとします。

どういうところが間違っていますか?私のコメントに基づいて

TKS

+0

更新コード内で、2行目が3行目のオブジェクトを変更しますか? 2番目の行は3行目に影響を与えません(少なくとも、私はそれがうまくいくと思います)。 –

+0

オースティン、2番目の行は、分離されたレジスタと永続化されたレジスタを関連付けることです – Alexandre

答えて

2

代わりにこれを試してみてください:

var prof = new Profile { ID = 1, Enabled = false }; 
// Attach prof as unchanged entity 
context.Profiles.Attach(prof); 
// Get state entry for prof 
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(prof); 
// Set only Enabled property to changed 
entry.SetModifiedProperty("Enabled"); 
context.SaveChanges(); 

あなたは私がデータベースから最初のエンティティをロードする必要はありませんでした見ることができるように。どのプロパティが分離されたエンティティで変更されたかを設定することができました。

+0

それは動作します、tks。私はentry.SetModifiedProperty( "PropName")を追加するためにt4テンプレートを変更することを検討しています。すべての不動産について、あなたはどう思いますか? – Alexandre

+0

それから、エンティティ全体を変更状態=すべてのプロパティが更新されるように設定することと同じになります。 –

+0

はい、プロパティの値が変更された場合のみentry.SetModifiedProperty( "PropName")を呼び出します – Alexandre

0

:EF4を知らなくても、これは私はそれが動作することを期待したい方法です:

var prof = context.Profiles.Single (s => s.ID == 1); 
prof.Enabled = false; 
context.Profiles.ApplyCurrentValues(prof); 
context.SaveChanges(); 

SingleはLINQのシングルで、それはその値を返しますと仮定すると、変更する必要があります。

+0

このように動作しますが、efはすべての列の更新を生成しています – Alexandre

0

これは機能しませんか?

var prof = context.Profiles.Single(s => s.ID == 1); 
prof.Enabled = false; 
context.SaveChanges(); 

私はこの問題は、あなたが追跡されていないオブジェクトからApplyCurrentValuesを呼び出しているということだと思う - すべてプロパティをこれはプロパティが変更されていないとしている何のアイデアを持っていないことを意味し、そう間で、それだけでコピーしますあなたのケースではnullを含むものを含みます。

データコンテキストから読み込まれたエンティティの値を変更する場合は、ApplyCurrentValuesを呼び出す必要はありません。

+0

これは動作しますが、エンドユーザはデータコンテキストにアクセスできません。私のビジネスクラスはエンティティをデタッチさせます – Alexandre

関連する問題