有没有办法在LLBLGen中执行Insert或Update / Merge / Upsert

时间:2012-07-31 15:17:58

标签: sql-server orm sql-server-2008-r2 llblgenpro llblgen

我想在没有先获取然后保存实体的情况下使用LLBLGen进行upmerge。 我已经发现有可能在没有首先获取实体的情况下进行更新,但后来我必须知道它已经存在。

更新条目的频率与插入新条目的频率相同。

是否有可能一步到位?
一步到位是否有意义?

事实:

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

3 个答案:

答案 0 :(得分:1)

我知道我有点迟到了,但是我记得和LLBLGenPro一起工作时,它是完全有可能的,其中一个美女是可能的! 我没有我的样本,但我很确定你有一个名为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并将其替换为另一个的场景中可能会有用。

希望这有用。

答案 1 :(得分:1)

我认为您可以使用EntityCollection实现您所需要的功能。首先通过DataAccessAdapter的FetchEntityCollection方法获取要更新的实体,然后在该集合中更改所需的任何内容,向其中插入新实体并使用DataAccessAdapter,SaveCollection方法保存它。这样就可以更新现有实体,并将新的实体插入数据库。例如,在您想要操纵指定产品订单的产品订单senario中,您可以使用以下内容:

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);
 }

答案 2 :(得分:0)

据我所知,这是不可能的,也是不可能的。

如果您只是在未获取的实体上调用adapter.Save(entity),框架会认为它是新的。如果你考虑一下,框架怎么知道是发出UPDATE还是INSERT语句?无论如何,某些地方必须查询数据库以查看该行是否存在。

为单个实体(非递归)保存创建或多或少自动执行此操作的东西并不太难。步骤如下:

  1. 创建一个新实体并设置它的字段。
  2. 尝试使用PK或唯一约束来获取相同类型的实体(还有其他选项,但没有一个是统一的)
  3. 如果提取失败,只需保存新实体(INSERT)
  4. 如果获取成功,则将创建的实体的字段映射到获取的实体的字段。
  5. 保存获取的实体(UPDATE)。