3

最初にエンティティをフェッチして保存せずに、LLBLGenを使用してアップマージを実行したいと思います。
最初にエンティティをフェッチせずに更新する可能性をすでに見つけましたが、それがすでに存在することを知る必要があります。

エントリの更新は、新しいエントリの挿入とほぼ同じ頻度で行われます。

これを1つのステップで実行する可能性はありますか?
ワンステップでそれを行うのは理にかなっていますか?

事実:

  • LLBLgen Pro 2.6
  • SQL Server 2008 R2
  • .NET 3.5 SP1
4

3 に答える 3

1

EntityCollection を使用することで、探しているものを実現できると思います。最初に DataAccessAdapter の FetchEntityCollection メソッドで更新するエンティティを取得し、次にそのコレクションで必要なものを変更し、新しいエンティティを挿入して、DataAccessAdapter の SaveCollection メソッドを使用して保存します。このようにして、既存のエンティティが更新され、新しいエンティティがデータベースに挿入されます。たとえば、指定された製品の注文を操作する製品注文シナリオでは、次のようなものを使用できます。

int productId = 23;
var orders = new EntityCollection<OrderEntity>();
using (DataAccessAdapter daa = new DataAccessAdapter())
{
    daa.FetchEntityCollection(orders, new RelationPredicateBucket(OrderFields.ProductId == productId))

    foreach(var order in orders)
    {
        order.State = 1;
    }

    OrderEntity newOrder = new OrderEntity();
    newOrder.ProductId == productId;
    newOrder.State = 0;
    orders.Add(newOrder);

    daa.SaveEntityCollection(orders);
 }
于 2012-09-06T16:59:16.383 に答える
1

私はこれに少し遅れていることを知っていますが、LLBLGenPro で作業したことを覚えているので、それは完全に可能であり、その美しさの 1 つはすべてが可能であることです! サンプルはありませんが、次のUpdateEntitiesDirectlyように使用できる名前のメソッドがあると確信しています。

// suppose we have Product and Order Entities
using (var daa = new DataAccessAdapter())
{
    int numberOfUpdatedEntities = 
        daa.UpdateEntitiesDirectly(OrderFields.ProductId == 23 && OrderFields.Date > DateTime.Now.AddDays(-2));
}

LLBLGenPro を使用したとき、ORM フレームワークで可能なことはほとんどすべて行うことができました。DeleteEntitiesDirectlyまた、etity を削除して別のものに置き換える必要があるシナリオで役立つ可能性のあるバッチ削除を実行するメソッドもあります。

これが役に立てば幸いです。

于 2012-09-05T19:37:47.767 に答える
0

私の知る限り、これは不可能であり、不可能です。

フェッチされていないエンティティで単に adapter.Save(entity) を呼び出すと、フレームワークはそれが新しいと見なします。考えてみると、フレームワークは UPDATE ステートメントと INSERT ステートメントのどちらを発行するかをどのように判断できるのでしょうか? いずれにせよ、行が存在するかどうかを確認するために、どこかでデータベースにクエリを実行する必要があります。

単一のエンティティ (非再帰的) 保存に対して多かれ少なかれ自動的にこれを行うものを作成することはそれほど難しくありません。手順は次のようになります。

  1. 新しいエンティティを作成し、そのフィールドを設定します。
  2. PK または一意の制約を使用して、同じタイプのエンティティをフェッチしようとします (他のオプションもありますが、統一されたものはありません)。
  3. フェッチが失敗した場合は、新しいエンティティを保存するだけです (INSERT)
  4. フェッチが成功した場合は、作成されたエンティティのフィールドをフェッチされたエンティティのフィールドにマップします。
  5. 取得したエンティティを保存します (UPDATE)。
于 2012-07-31T17:55:01.177 に答える