【问题标题】:Entity Framework detect internal relation cnages实体框架检测内部关系变化
【发布时间】:2017-05-03 08:19:02
【问题描述】:

我有一个看起来像这样的模型(不完全是):

class Child
{
    public virtual Parent AssignedParent { get; set; }
} 

class Container 
{
   public virtual ICollection<Child> Children { get; set; }
   public Child ActiveChild { get; set; }
}

换句话说:一个容器可以有很多活跃的孩子,但最多只有一个是活跃的。这很好用。

但现在我需要检查这样的容器是否更改了 activechild 属性。 DC.ChangeTracker.HasChanges() 执行正确,但如果我得到带有 DC.ChangeTracker.Entries() 的条目,我看到它没有改变。 此属性不在 CurrentValues 或 OriginalValues 集合中,看起来没问题,因为它是一个导航属性。

但是我怎样才能检查这个有没有改变呢?

【问题讨论】:

  • 拨打SaveChanges()会发生什么?更改是否保存到数据库中?为什么要查看ChangeTracker?您是否遇到其他问题并认为更改跟踪存在问题?
  • 是的,他们得救了。所以在某个地方,在内部,这是被跟踪的。但我不知道如何处理它。我需要知道是否仅更改了特定属性或其他任何内容。我的类型相当复杂(嵌套对象在支持字段中序列化为 json)。所以我想依靠EF不要深入遍历所有属性。

标签: entity-framework c#-4.0


【解决方案1】:

添加 ForeignKey 属性:

class Container
{
    public virtual ICollection<Child> Children { get; set; }
    [ForeignKey("ActiveChild")
    public int ActiveChildId { get; set; }
    public Child ActiveChild { get; set; }
}

重写 DbContext SaveChanges 方法:

 public override int SaveChanges()
    {
        #region Auditing

        foreach (var entry in ChangeTracker.Entries()
                 .Where(e => e.Entity is IAuditInfo && e.State == EntityState.Modified))
        {

        }
        return base.SaveChanges();
        #endregion
    }

您可以检查特定类的类型,而不是 IAudiInfo,例如容器。 您的 foreignKey - ActiveChildId 应该存在于 entry.CurrentValues[] 和 entry.OldValues[] 中。 对 ID 的比较应该会告诉您它是否已更改。

【讨论】:

  • 看起来不错。我不知道如何使该 id 在实体中直接可见。它尝试为此添加一个新的表字段的唯一事情。但是已经生成了一个 ActiveChild_id 字段来在后台保存外键(我无法访问)。如果我添加 ActiveChild_id 属性,它会尝试添加 ActiveChild_id1 字段。我能否以某种方式说服它使用现有的,所以我不需要迁移,因为在表级别实际上应该没有任何改变。
  • 按照惯例,如果您没有明确定义,EF 会自动生成与外键对应的属性。您可以添加外键属性,就像我定义的那样,给它一些不同的名称。然后,当您添加新迁移时,它应该删除自动生成的迁移并添加您明确定义的迁移。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
相关资源
最近更新 更多