在Linq-to-SQL中检索ID为动态的行

本文关键字:动态 ID Linq-to-SQL 检索 | 更新日期: 2023-09-27 18:30:04

我有以下代码:

var db = new IpsDBDataContext(connectionString);
var record = new IpsJobQueue();
var config = new IpsJobFileConfig();
record.FileName = file.Name;
record.FileNameConventionID = ....?
record.PickupDate = DateTime.Now;
// hard coded to follow suit with "unprocessed" flag in 
// IpsJobProcessCodes table.
record.ProcessStatus = 1; 
record.CreationTime = file.CreationTime;
record.StartTime = null;
record.EndTime = null;
db.IpsJobQueues.InsertOnSubmit(record);
db.SubmitChanges();

我关心的线路是record.FilenameConventionID = ...?

在这里,我需要将FileNameConventionID分配给IpsJobFileConfig表中的ID(作为外键),其中PublisherName列="Undetermined"。这很容易做到,但问题是与此记录类型(未确定)相关联的ID可能会在升级到生产时发生更改。

因此,我认为我需要分两步来做。

  1. 查找其PublisherName = Undetermined的记录
  2. 获取该记录上的ID(因为它将是动态的)

问题是:我如何反射性地从我选择的记录的列中获取ID?

在Linq-to-SQL中检索ID为动态的行

现在您正在创建一个新的IpsJobFileConfig记录,但没有使用它。我猜您可以完全摆脱它。

您应该能够逃脱(假设IpsJobFileConfig表中任何具有正确发布者名称的记录都可以工作,因为可能有多行):

var config = db.IpsJobFileConfigs.First(c => c.PublisherName == "Undetermined");
record.FileNameConventionID = config.Id;

您有一个JobQueue实例和一个相关的先前存在的JobFileConfig实例。

您应该从数据库加载JobFileConfig,如下所示:

JobFileConfig config = db.JobFileConfig.Where(c => c.PublisherName == "Undetermined").FirstOrDefault();

然后,您应该将新实例附加到对象图上,如下所示:

config.JobQueues.Add(myJobQueue);

不要分配ID。不要InsertOnSubmit新的JobQueue实例。它连接到对象图,当您调用SubmitChanges()时,DataContext将管理其余部分。它会将新实例保存到数据库中,并将任何ID填充回实例中。


PS:DataContext实现了IDispoable,所以你应该using它。

using(IpsDBDataContext db = new IpsDBDataContext(connectionString))
{
  ...
}