LINQ to Entityによる挿入または更新

私は新しいプロジェクトのDALとしてEntityにLinqを使用しようとしています。

私のDALでは、この方法でジョブエンティティ

    public Job LoadJob(int id)
    {
        Job job = new Job();

        using (TNEntities context = new TNEntities())
        {
            var jobEntity = (from c in context.Jobs
                      where c.id == id
                      select c).First();

            job = (Job)jobEntity;                
        }

        return job;
    }

私は自分のプログラムでJobエンティティを使用して、それを保存したいと思います:

私はいくつかのことを試みましたが、私の方法はこのように見えます(うまくいきません)

    public void SaveJob(Job job)
    {
        using (TNEntities context = new TNEntities())
        {
            context.Jobs.AddObject(job);
            context.SaveChanges();
        }
    }

context.jobs.attach(job)を試してみましたが、エラーは発生しませんが、ジョブは更新されません。私は、ジョブが使用コンテキストの範囲外であるため、ジョブがコンテキスト外になっていると仮定します。しかし、私は最初の方法で選択したジョブを更新するように再接続する方法がわかりません。

1

2 答え

理想的には、あなたの仕事を文脈から読んで、変更を加え、最初に読んだ同じ文脈でSaveChangesを呼びたいとします。変更されたエンティティを新しいコンテキストにアタッチし、そのステータスを「変更済み」に設定することは可能です(ただし、変更された子オブジェクトがこの方法で虐待されていることがわかりました)。

より簡単なアプローチの1つは、 TNEntities コンテキストの1つのインスタンスを持つDataAccessオブジェクトにこれらの操作をすべて持ち、それを使用してジョブエンティティを読み取り、変更を保存することです。

public class JobDao : IDisposable {

    TNEntities context = new TNEntities();

    public Job LoadJob(int id)
    {
       return this.context.Jobs.First(c => c.id == id);
    }

    public void Save(){
       this.context.SaveChanges();
    }

    public void Dispose(){
        this.Context.Dispose();
    }
}

(もちろん、その定型コードをベースクラスにたくさん入れたいと思うでしょう)

using(JobDao dao = new JobDao()) {
   Job j = dao.LoadJob(12);
   j.JobTitle = "Software Developer";
   dao.Save();
}
0
追加された
@マイケル - これが一番簡単な方法です。あなたのアプローチを再考してください。DAOを使ってこのようなことを本当にきれいに簡単に行うことができます
追加された 著者 Adam Rackis,
他の方法はありませんか?エンティティをダウンロードして渡したい場合は、DALクラスを渡す必要がありますか?
追加された 著者 michael,

私はあなたのapplication.xaml.csにプロパティを残すことを検討することをお勧めします

public TNEntities context {get; private set;}

起動時にTNEntitiesが初期化されます。それはあなたの人生を楽にします。

0
追加された
Windowsフォームプログラムのapplication.xaml.csファイルはどこにありますか?
追加された 著者 michael,
DALはWinFormsとWebページで使用されます
追加された 著者 michael,
あなたはどんなプロジェクトをしていますか? WinForms/WPF/Silverlight/Web?
追加された 著者 Malcolm O'Hare,
application.xaml.csはsilverlight/wpfのみです。 winformsのバージョンはメインウィンドウに表示され、他のすべてのウィンドウにメインウィンドウへの参照があることを確認してプロパティを取得できるようにします。ウェブでは、それに匹敵するものはありません(afaik、私はそこで過度の経験はありません)が、あなたのデザインはとにかく異なっています。
追加された 著者 Malcolm O'Hare,