Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有办法在LLBLGen中执行插入或更新/合并/升级插入_Sql Server_Orm_Sql Server 2008 R2_Llblgenpro_Llblgen - Fatal编程技术网

Sql server 有没有办法在LLBLGen中执行插入或更新/合并/升级插入

Sql server 有没有办法在LLBLGen中执行插入或更新/合并/升级插入,sql-server,orm,sql-server-2008-r2,llblgenpro,llblgen,Sql Server,Orm,Sql Server 2008 R2,Llblgenpro,Llblgen,我想使用LLBLGen进行升级合并,而不需要先获取然后保存实体。 我已经找到了在不首先获取实体的情况下进行更新的可能性,但是我必须知道它已经存在了 更新条目的频率与插入新条目的频率差不多 是否有可能一步到位? 一步到位有意义吗 事实: llblgenpro2.6 SQL Server 2008 R2 .NET3.5SP1 据我所知,这是不可能的,也是不可能的 如果您只是对一个未获取的实体调用adapter.Save(entity),框架将假定它是新的。仔细想想,框架怎么知道是发出UPDATE语

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

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

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

事实:

  • llblgenpro2.6
  • SQL Server 2008 R2
  • .NET3.5SP1

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

      如果您只是对一个未获取的实体调用adapter.Save(entity),框架将假定它是新的。仔细想想,框架怎么知道是发出UPDATE语句还是INSERT语句呢?不管怎样,某处都必须查询数据库以查看该行是否存在

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

    • 创建新实体并设置其字段
    • 尝试使用PK或唯一约束获取相同类型的实体(也有其他选项,但没有统一的选项)
    • 如果提取失败,只需保存新实体(插入)
    • 如果提取成功,请将所创建实体的字段映射到所提取实体的字段
    • 保存获取的实体(更新)

    • 我知道我有点晚了,但正如我记得与LLBLGenPro合作时,这是完全可能的,它的优点之一就是一切皆有可能! 我没有我的示例,但我很确定有一个名为
      updateentiesdirectly
      的方法可以像这样使用:

      // 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));
      }
      
      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);
       }
      
      当使用LLBLGenPro时,我们能够用ORM框架完成所有可能的事情,这太棒了! 它还有一个批量删除的方法,名为
      deleteentiesdirectly
      ,该方法在需要删除一个实体并用另一个替换的场景中非常有用


      希望这对您有所帮助。

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

      // 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));
      }
      
      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);
       }
      
      intproductid=23;
      var orders=new EntityCollection();
      使用(DataAccessAdapter daa=new DataAccessAdapter())
      {
      FetchEntityCollection(订单,新关系谓词Bucket(OrderFields.ProductId==ProductId))
      foreach(订单中的var订单)
      {
      顺序。状态=1;
      }
      OrderEntity newOrder=新OrderEntity();
      newOrder.ProductId==ProductId;
      newOrder.State=0;
      订单。添加(新订单);
      daa.SaveEntityCollection(订单);
      }
      
      完全正确。还有一些DB构造允许这样做(即合并、升级)。另外:在LLBLGen中保存实体时,将manually IsNew设置为false可以在不首先获取它的情况下进行更新。我想下一步会很简单,如果可以的话可以更新,否则可以插入。嗨。我知道这个方法。问题是,我事先不知道要更新哪些项目和插入哪些项目。要知道我必须先获取它们(我现在这样做)。@Stampedev如果你不知道要更新哪些实体,那么你就不知道要获取哪些实体!!此外,此方法仅更新现有的实体,不插入新的实体。我只有要更新的实体的PK。但对于每个实体,应更新的值可能不同。所以我创建了对象。。。然后呢?:)现在我完全明白你的意思了!我认为您可以通过实体集合来实现这一点。他希望一步完成,而不是首先获取实体。是否可以将实体的主键设置为更新?我不认为一步就可以完成,这不是sql server的工作方式,因此也不是LLBLGen的方式。如果可能,我希望一步完成。在SQL中有这样做的可能性(如果我没记错的话,比如MERGE或UPSERT),即使它们并不完美。我已经按照你建议的方式做了,但我一直在寻找更好的方法。谢谢你的回答!