EF Core 2.1 [变更追踪]-保存所有相关实体

时间:2019-03-14 21:15:27

标签: c# entity-framework-core ef-core-2.1 change-tracking

也许标题被误解了,但是我要在这里解释我的情况。

因此,考虑具有虚拟属性Person的我的实体Country,如下所示:

public class Person {
    public long Id { get; set;}
    public short IdCountry { get; set;}
    public virtual Country Country { get; set; }
    ...
}

及其映射如下:

...
builder.HasOne(c => c.Country)
    .WithMany()
    .HasForeignKey(c => c.IdCountry);

我的存储库是通用的。

这里发生的是,当我尝试保存Person中的某些更改时,Country实体状态出现在我眼前,因为Added毫无意义。

我在这里展示一个类似的例子,说明我正在发生什么。实际上,我在班级Person中有五个其他虚拟属性,其中一些处于这种状态(Added)。

以前有没有人处理过? 预先感谢。


编辑:Ansewing @alans回复:我正在做如下类似的事情:

foreach (var entrie in entry.Context.ChangeTracker.Entries())
{
    try
    {
        key = entrie.Entity.GetType().GetProperty("Id").GetValue(entrie.Entity, null);
    }
    catch (Exception ex)
    {
        key = null;
    }
    if (key != null && entrie.State == EntityState.Added)
    {
        entrie.State = EntityState.Unchanged;
    }
    else if (Convert.ChangeType(key, typeof(long)) as long? == 0)
    {
        entrie.State = EntityState.Added;
    }
}
_dbContext.SaveChanges();

@TanvirArjel上面的方法是状态为Added

2 个答案:

答案 0 :(得分:0)

我在EF6中使用AsNoTracking()扩展方法来解决性能问题,但是我意识到在EFCore中,此特定方法有点不同(我正在迁移代码)。所以,我只删除了方法

答案 1 :(得分:-1)

您要在某个地方更新Country对象吗?如果属性的键具有默认值,它将被标记为已添加。那是我的猜测。