3

我想使用 LLBLGen 进行升级,而无需先获取然后保存实体。
我已经找到了在不先获取实体的情况下进行更新的可能性,但是我必须知道它已经存在。

更新条目的频率与插入新条目的频率差不多。

是否有可能一步完成?
一步完成有意义吗?

事实:

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

3 回答 3

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,这在您需要删除一个实体并将其替换为另一个实体的情况下可能很有用。

希望这会有所帮助。

于 2012-09-05T19:37:47.767 回答
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 回答
0

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

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

为单个实体(非递归)保存创建或多或少自动执行此操作的东西并不难。这些步骤将类似于:

  1. 创建一个新实体并设置它的字段。
  2. 尝试使用 PK 或唯一约束获取相同类型的实体(还有其他选项,但没有统一的选项)
  3. 如果获取失败,只需保存新实体(INSERT)
  4. 如果获取成功,将创建的实体的字段映射到获取的实体的字段。
  5. 保存获取的实体(更新)。
于 2012-07-31T17:55:01.177 回答