感到惊讶的是Entity Framework正确地保存了一个独立的实体

时间:2016-11-16 23:35:46

标签: c# entity-framework

我有一个实体类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被插入到数据库中。

1 个答案:

答案 0 :(得分:3)

EntityState.Unchanged告诉上下文 Timecard 实体没有任何变化。

TimecardRow是一个单独的实体,EF将单独跟踪,因此对SaveChanges的调用将插入该实体。

以上假设在传递给Save方法时已经附加了Timecard(如果它是从GetTimeCardForPerson方法返回的相同实例,那么它将被添加)。

如果在Save方法中的Id检查是为了处理分离和附加的实体,那么除非id是0,否则最好不要单独保留状态?