EF Core 2.1 [更改跟踪] - 保存所有相关实体
EF Core 2.1 [change tracking] - saving all related entities
也许标题被误解了,但我会尝试在这里解释我的情况。
因此,考虑到我的实体 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
没有意义。
我在这里举了一个发生在我身上的类似例子。实际上,我的 class 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
您是在某处更新 Country 对象吗?如果 属性 的键有默认值,我会将其标记为已添加。这是我的猜测。
我在 EF6 中使用 AsNoTracking()
扩展方法来解决性能问题,但我意识到在 EFCore 这个特定方法 中有点不同(我正在迁移代码).所以,我只删除了方法
也许标题被误解了,但我会尝试在这里解释我的情况。
因此,考虑到我的实体 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
没有意义。
我在这里举了一个发生在我身上的类似例子。实际上,我的 class 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
您是在某处更新 Country 对象吗?如果 属性 的键有默认值,我会将其标记为已添加。这是我的猜测。
我在 EF6 中使用 AsNoTracking()
扩展方法来解决性能问题,但我意识到在 EFCore 这个特定方法 中有点不同(我正在迁移代码).所以,我只删除了方法