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