Sql server 有没有办法在LLBLGen中执行插入或更新/合并/升级插入
我想使用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语
我已经找到了在不首先获取实体的情况下进行更新的可能性,但是我必须知道它已经存在了 更新条目的频率与插入新条目的频率差不多 是否有可能一步到位?
一步到位有意义吗 事实:
- llblgenpro2.6
- SQL Server 2008 R2
- .NET3.5SP1
- 创建新实体并设置其字段
- 尝试使用PK或唯一约束获取相同类型的实体(也有其他选项,但没有统一的选项)
- 如果提取失败,只需保存新实体(插入)
- 如果提取成功,请将所创建实体的字段映射到所提取实体的字段
- 保存获取的实体(更新)
- 据我所知,这是不可能的,也是不可能的
如果您只是对一个未获取的实体调用adapter.Save(entity),框架将假定它是新的。仔细想想,框架怎么知道是发出UPDATE语句还是INSERT语句呢?不管怎样,某处都必须查询数据库以查看该行是否存在
要为单个实体(非递归)保存创建或多或少自动执行此操作的内容并不太困难。步骤如下:
我知道我有点晚了,但正如我记得与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),即使它们并不完美。我已经按照你建议的方式做了,但我一直在寻找更好的方法。谢谢你的回答!