私のオブジェクトがlinqで更新されないのはなぜですか?

私は、例えば、DBからオブジェクトを読み込むメソッドを持っています:

public Object getProduct(int categoryId, int productId)
{
        DataClassesDataContext db = new DataClassesDataContext(Settings.getDefaultConnectionStringName());

        switch (categoryId)
        {
            case CCategorii.CARTI_ID:
                {
                    IEnumerable product = (from c in db.Cartis
                                                  where c.Carti_id == productId
                                                  && c.Vizibil == true
                                                  select c);

                    if (product.Count() != 0)
                        return product.First();

                    break;
                }
           //so on
        }
}

今私は更新を行う別の方法があります:

public void updateProduct()
{
   Object productToBeUpdated = getProduct(1,1);
    DataClassesDataContext db = new DataClassesDataContext(Settings.getDefaultConnectionStringName());
   //update some properties of the product
   productToBeUpdated.setQuantity(productToBeUpdated.getQuantity()+1);
   db.submitChanges();
}

まあ、以前の方法ではうまく読み込めましたが、DBに変更が加えられていませんでした。

I think the cause is that I do this READ-UPDATE in two different DataContext...If this is the cause how do you threat this situations?

ああ、私は製品を読んで同じ方法で更新することができますが、これは私が読んで使っている方法を複製して更新情報を追加することを意味します...そして、私はこれを避けたいと思います。

0
dbのインスタンスを1つ作成して更新します。インスタンスを編集して、もう一方のインスタンスを保存しています。
追加された 著者 Pankaj Upadhyay,

5 答え

私はあなたが読み書きのために別のコンテキストを使用しているからだと思います。 DataClassesDataContext 変数をクラスレベルに移動してみてください。

3
追加された
@Cristianのこれらのメソッドは、同じオブジェクト型とデータコンテキスト上で動作します。これは、同じクラスに属するべきであることを示す良いヒントです。
追加された 著者 fearofawhackplanet,
はい、同じクラスにメソッドがあればいいです。そうでなければ、Zrutyの溶液はよりよく見える。
追加された 著者 Cristian Boariu,
これは最高の解決策であるようです.... @chritian、これをして、あなたは十分にロックンロールする
追加された 著者 Pankaj Upadhyay,
うーん....その場合、datacontextを渡す必要がありますが、クラス内では、はるかに良いです
追加された 著者 Pankaj Upadhyay,

1つのオプションは、共通のデータコンテキストを使用し、それをパラメータとしてgetXXXメソッドに渡すことです。

public Object getProduct(DataClassesDataContext db, int categoryId, int productId)
{
    switch (categoryId)
    {
        case CCategorii.CARTI_ID:
            {
                IEnumerable product = (from c in db.Cartis
                                              where c.Carti_id == productId
                                              && c.Vizibil == true
                                              select c);

                if (product.Count() != 0)
                    return product.First();

                break;
            }
       //so on
    }
}

その後:

public void updateProduct()
{
    using (DataClassesDataContext db = new DataClassesDataContext(Settings.getDefaultConnectionStringName()))
    {
       Object productToBeUpdated = getProduct(db, 1,1);
       //update some properties of the product
       productToBeUpdated.setQuantity(productToBeUpdated.getQuantity()+1);//THX @AVD, didn't notice that.
       db.submitChanges();
    }
}
2
追加された
ああ、それについて考えなかった!かなりクール:)
追加された 著者 Cristian Boariu,

DataContextの2つの異なるインスタンスを使用しています。

Webアプリケーションを実装するときは、通常、DataContextの有効期間を1つのHTTPリクエストの有効期間に合わせることが最善の選択肢です。あなたが使用している寿命は短すぎます。

別のオプションは、オブジェクトを書き込みデータコンテキストに添付することです。

db.Cartis.Attach(yourReadObject);
updateProperties(yourReadObject);
db.submitChanges();

編集

まずオブジェクトを他のコンテキストから切り離さなければなりません。それを行う方法については、この記事を参照してください。

しかし、私は本当に単一のDataContextオブジェクトを使用し、寿命をhttprequestスコープに拡張することをお勧めします。

これは、オートファックのようなiocコンテナで本当にうまくいきます。

1
追加された
これはサポートされていないようです:別のDataContextから読み込まれた可能性のある、新規ではないエンティティをAttachまたはAddしようとしました。これはサポートされていません。
追加された 著者 Cristian Boariu,
私の編集を参照してください。最初にエンティティオブジェクトをデタッチする必要があります。
追加された 著者 Jan,

DataContextが範囲外になるとすぐに、エンティティはデタッチされます。つまり、もはやコンテキストによって追跡されなくなり、変更内容を保存することができなくなります。

エンティティがコンテキストから切り離されないように、コンテキストを共有することも、それを2番目のコンテキストに再接続することもできます( DataContext.Attach

0
追加された

++演算子を使用して、同じコンテキストを使用してオブジェクトを更新することはできません。これを試して、

productToBeUpdated.setQuantity(productToBeUpdated.getQuantity()+1);
0
追加された
ええ、これは私がここにコードを書いたからです。しかし、他のプロパティは更新されません。私が持っていたさまざまなプロジェクトでこの状況に遭遇しました。これはほんの一例です。
追加された 著者 Cristian Boariu,