【问题标题】:Linq to SQL SubmitChanges only for specific tableLinq to SQL SubmitChanges 仅适用于特定表
【发布时间】:2013-01-06 18:02:30
【问题描述】:

我用 linq to sql 有一段时间了,经常遇到这类问题....

例如 我有 2 个数据库表

-表格:发票(“Id”int 自增,“InvoiceDate”日期时间)

-Table: InvoiceItems ("Id" int auto-increment, "InvoiceId" int (FK), "SomeReference" varchar(50))

“SomeReference”字段包含一个值,该值是父发票记录中的 Id 和一些随机字符的组合。例如。 “145AHTL”

在我可以设置 SomeReference 的值之前,我需要知道 Invoice Id 的值,但这只有在保存到数据库时才会填充。我在同一个 Linq to SQl DB 上下文中有父记录和子记录,但我只想对父 Invoice 记录执行“SubmitChanges”,这样我就可以在子记录中填充 SomeReference。我不想在设置 SomeReference 之前将子 InvoiceItem 记录保存到数据库中。

如何使用 Linq to Sql 实现这一点?

我知道 linq to sql 使用“工作单元”的想法来保存到数据库,但我不明白如何避免在尚未准备好保存记录时将它们不必要地保存到数据库。如果没有办法解决这个问题,那么为什么开发人员还要使用 linq to sql,因为这似乎是一个巨大的缺点?

编辑:应该注意,这个例子只是我想出来帮助描述我的问题。

【问题讨论】:

  • 为什么不保存发票,获取id,然后创建并保存项目? (我也觉得存储两次 ID 很奇怪)
  • 您能否分享一下您是如何将数据从Invoice 保存到InvoiceItems 表的代码?
  • 这意味着在将父对象保存到数据库之前,我无法将父对象映射/链接到子对象。

标签: c# .net sql sql-server linq-to-sql


【解决方案1】:

你不能。不是这样。这是唯一的方法(linq会费不支持序列)。残酷地说 - 你必须修正你的逻辑。发票的 ID 不是参考字段。它不应该永远是数字。这是一个逻辑字段,应由您的逻辑在 Id 之外处理。

【讨论】:

  • 这只是我想出的一个例子来描述我在寻找什么。发票可能不是最好的例子。也许 Order 和 OrderItem 的例子更好。我只是想弄清楚如何保存父记录而不是子记录。
  • 不,同样糟糕的例子。订单 ID 是逻辑结构,一开始不应来自数据库。
  • 保存父母而不是孩子,保存父母而不是孩子。 IE。保存父级,然后重新加载,然后添加创建子级。很简单。
  • 这意味着在将父对象保存到数据库之前,我无法将父对象映射/链接到子对象。
  • 不,在此之前您无法读出 ID。就是这样 - 这就是你的问题。
【解决方案2】:

您的示例可以完成,但您需要忘记 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()

因此,您将实体分配给彼此,而不是键。

第二个:SomeReference

然而,这第一部分并没有给你一些引用字段,只是正确设置了外键。

您的 somereference 字段包含冗余数据(不是必需的),因此需要解决。

somereference 是一个字符串 + ID。

因此,您将字符串部分存储在数据库的列中(并且仅此列),然后使用部分类实现自定义属性 somereference。

  public partial class tb_detail
    {
        public string somereference
        {
             get
            {
               return _id.ToString() + _somestring;
}}}

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多