C# 插入辅助进程时复制状态行

C# 插入辅助进程时复制状态行,c#,.net,entity-framework,C#,.net,Entity Framework,我正在使用实体框架。我有一张工作表: 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 {g

我正在使用实体框架。我有一张工作表:

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甚至状态(导航属性)。 但它不是只插入worker,而是同时插入status并为相同的status创建一个新行(即使我在status对象中填充statusId和id)


为什么要插入记录?。

如果状态存在,则应使用该id设置statusid。否则,必须获取该状态对象并将其分配给对象属性


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

如果不希望创建新的状态,您可以将状态附加到上下文中:

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();

此处重要的是导航属性
status
null

,以便插入、仅设置statusId并将status保留为null。
这将使插入没有重复关联。

如果填充状态对象,框架实体会将其视为新对象(或行)。

请尝试设置statusId或从DB获取状态对象。不要设置id并指定具有相同id的新状态对象。