1

我一直在使用 linq to sql 一段时间,经常遇到这种类型的问题....

例如,我有 2 个数据库表

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

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

“SomeReference”字段包含一个值,它是来自父 Invoice 记录的 Id 和一些随机字符的组合。例如。“145AHTL”

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

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

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

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

4

2 回答 2

1

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

于 2013-01-06T18:12:37.803 回答
1

您的示例可以完成,但是您需要忘记 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 字段包含冗余数据(不是必需的),因此需要解决。

somereference 是一个字符串+ ID。

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

  public partial class tb_detail
    {
        public string somereference
        {
             get
            {
               return _id.ToString() + _somestring;
}}}
于 2013-01-07T11:37:25.337 回答