我有一个实体类Timecard
,我从这个方法中得到了这个实体:
public Timecard GetTimeCardForPerson(long timecardId)
{
return timecardContext.First(item => item.TimeCardId = timeCardId);
}
timecardContext的类型为TimecardContext: DbContext
。
我稍后对Timecard
实体进行了更改,Timecard
实体有一个属性:
public virtual ICollection<TimecardRow> TimeCardRows { get; set; }
在Timecard's
构造函数中初始化为HashSet
,如此:
this.TimeCardRows = new HashSet<TimecardRow>();
我添加一个子TimecardRow
然后我调用另一个方法,这是它的确切实现,并将它传递给从GetTimeCardForPerson
返回的相同Timecard实例:
public void SaveTimecard(Timecard timeCard)
{
timecardContext.Entry(timeCard).State = timeCard.TimecardId == 0
? EntityState.Added
: EntityState.Unchanged;
timecardContext.SaveChanges();
}
传入的Timecard timeCard
参数未附加到timecardContext
,并且有一个TimecardId&gt; 0
我很惊讶我的新TimecardRow
成功保存为Entry(timeCard.State)设置为EntityState.Unchanged
。
EntityState.Unchanged告诉我的timecardContext没有什么可以改变的,不是吗?但同样,在调用TimecardRow
方法时,我添加的SaveTimecard
被插入到数据库中。
答案 0 :(得分:3)
EntityState.Unchanged告诉上下文 Timecard 实体没有任何变化。
TimecardRow是一个单独的实体,EF将单独跟踪,因此对SaveChanges的调用将插入该实体。
以上假设在传递给Save方法时已经附加了Timecard(如果它是从GetTimeCardForPerson方法返回的相同实例,那么它将被添加)。
如果在Save方法中的Id检查是为了处理分离和附加的实体,那么除非id是0,否则最好不要单独保留状态?