Linq to SQL只针对特定的表提交更改
本文关键字:提交 SQL to Linq | 更新日期: 2023-09-27 17:50:47
我使用linq to sql已经有一段时间了,经常遇到这类问题....
如我有2个db表
-Table: Invoice ("Id" int auto-increment, "InvoiceDate" datetime)
-Table: InvoiceItems ("Id" int auto-increment, "InvoiceId" int (FK), " somerreference " varchar(50))
"somerreference"字段包含一个值,该值是来自父Invoice记录的Id和一些随机字符的组合。如。"145 ahtl"
在我可以设置somerreference的值之前,我需要知道Invoice Id的值,但是这只有在保存到DB时才会被填充。我在同一个Linq到SQl DB上下文中都有父记录和子记录,但我只想对父发票记录执行"SubmitChanges",这样我就可以在子记录中填充somerreference。我不想有孩子的InvoiceItem记录保存到数据库之前somerreference设置。
我如何使用Linq to Sql实现这一点?
我明白linq to sql使用"工作单元"的想法来保存到db,但我不明白我如何避免不必要的保存记录到db,当他们还没有准备好被保存。如果没有办法解决这个问题,那么开发人员为什么要使用linq to sql,因为这似乎是一个巨大的缺点?
应该注意,这个例子只是我想出的一些东西来帮助描述我的问题。不能。不是这样的。这是唯一的方法(linq不支持序列)。残酷地说,你必须修正你的逻辑。发票的Id不是引用字段。它永远都不应该是这个数字。这是一个逻辑字段,应该由您的逻辑在Id之外处理。
可以完成您的示例,但是您需要忘记SQL和数据库,而是以ORM的方式考虑。
在您的示例
中需要解决两个问题第一次同时插入master和detail
伪代码:
using (var dc = new datacontext())
var master = new masterentity;
master.somedata = "data";
dc.tb_master.InsertOnSumbut(master)
var detail = new detailentity
detail.tb_master = master
dc.tb_detail.InsertOnSubmit(detail)
Submitchanges()
所以你将实体分配给彼此,而不是键。
第二个: somerreference
然而,第一部分并没有给你一些引用字段,只是正确地设置了外键。
您的somereference字段包含冗余数据(不必要),因此需要解决。
引用是一个字符串+ ID。
因此,您将字符串部分存储在数据库中的列中(并且仅存储该列),并通过使用部分类实现自定义属性引用。
public partial class tb_detail
{
public string somereference
{
get
{
return _id.ToString() + _somestring;
}}}