插入工作线程时复制状态行

本文关键字:状态 复制 工作 线程 插入 | 更新日期: 2023-09-27 17:54:58

我正在使用实体框架。我有工人表:

Worker(workerId, name, statusId)

我有POCO工作与导航属性:

class Worker {
   public virtual long workerId {get;set;}
   public virtual string name {get;set;}
   public virtual long statusId {get;set;}
   public virtual Status status {get;set;}
}

为了插入worker,我用相关的值填充了名称、状态id甚至状态(导航属性)。但是,它不是只插入工作者,而是插入状态并为相同的状态创建新行(即使我在状态对象中填充了statusId和id)。

插入工作线程时复制状态行

为了插入,只设置statusId,将status保留为空
这将使插入没有重复的关联。
如果您填充状态对象,框架实体将其视为一个新对象(或行)。

如果状态已存在,则应该使用该id设置statusid。或者你需要获取那个状态对象并将它分配给对象属性。

在以前的EF版本中,您必须获取状态对象或将entitykey值设置为状态id。

如果您不想创建一个新的Status,您可以状态附加到上下文:

var myStatus = new Status { statusId = 123, ... };
var myWorker = new Worker { status = myStatus, ... };
context.Stati.Attach(myStatus);
context.Workers.Add(myWorker)
context.SaveChanges();

如果Worker.statusId是一个公开的外键列,也应该可以简单地将其分配给新的Worker:

var myWorker = new Worker { statusId = 123, status = null, ... };
context.Workers.Add(myWorker)
context.SaveChanges();

这里导航属性statusnull是很重要的。