如果属性包含在select中,则无法在EF CORE中设置属性Id值

时间:2018-05-09 17:50:28

标签: c# entity-framework asp.net-core .net-core entity-framework-core

我正在使用Entity Framework 2.0.1,我遇到的问题是在2.x版的EF版本中运行良好。

如果我选择一个对象并在选择中包含一个属性,并且我想更新该属性,我必须更新对象引用,而不是引用EF的对象以识别并保存更改。

这是一个例子。 Ranking.RankTypeId是RankType.RankTypeId的外键。我选择并包含RankType属性。

public Ranking GetRankingById(int rankingId)
{
    using (var context = new BestNetDatabaseContext())
    {
        var rankings = context.Rankings.AsQueryable();

        var foundRanking = rankings.Include(x => x.RankType).FirstOrDefault(x => x.RankingId == rankingId);

        if (foundRanking == null)
            throw new RankingNotFoundException();

        return foundRanking;
    }
}

如果我想更新Ranking.RankType,我必须选择并获取RankType对象的实例并设置它。

ranking.RankType = _rankTypeService.GetRankTypeById(1);

我想做的事情(多年来一直在做)只是设置了Id。

ranking.RankTypeId = 1;

我将对象附加到上下文并在保存更改之前将状态设置为脏(此代码在以前版本的EF CORE中有效)。

public void UpdateRanking(Ranking ranking)
{
    using (var context = new MyDatabaseContext())
    {
        context.Rankings.Attach(ranking);
        context.Entry(ranking).State = EntityState.Modified; 
        //ranking.RankTypeId IS correctly set to 1 at this point
        context.SaveChanges();
    }
}

如果我不使用include语句,我可以设置Id和EF将识别更改并更新数据库。当我包含属性时,它似乎忽略了更新Id。想法?

0 个答案:

没有答案