2016-12-15 55 views
-1

我目前正在寻找方法来正确检查我的entitiy框架是否被添加,修改或删除。以下是我的编码:检查实体框架被添加,修改或删除

int state = 0; 

    var added = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList(); 
    var modified = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified).ToList(); 
    var deleted = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted).ToList(); 

     if (added.Count > 0) 
      state = 1; 
     if (modified.Count > 0) 
      state = 2; 
     if (deleted.Count > 0) 
      state = 3; 

目前它正在工作。我只想知道是否有其他适当的方式来做到这一点。

+1

说实话,我从来没有见过这种检查的必要性。如果我怀疑我有未决的更改,则执行SaveChanges()并继续。 你的问题确实让我好奇,是什么让你看到需要。你能详细说明一下吗? 此外,我意识到你的代码可能不是实际的代码,而是一个简化的版本。因此,如果一个条目发生了变化而另一个条目被删除,会发生什么?在你的例子中,状态似乎被覆盖了。我想你有一个更详细的状态跟踪结构? –

+0

@Streamcap您好Streamcap。其实我在做什么是我需要记录我的EF中的变化,并对其进行评论。例如,如果EF添加,评论将是“创建新(某些)”,如果修改它将是“更新(某事)”。现在,只有一个条目可以一次更改。你认为这是正确的吗?谢谢 – Farid

+0

@Farid确实有几种方法可以做到这一点。一种方法(尽管很粗糙)是在插入/更新/删除时写入日志行的数据库中放置触发器。另一种是使用日志框架,以防需要更详细地检测更改。我会建议看看Serilog,它是免费的而且功能强大,不需要额外的工作。 –

回答

0

为了提高性能

  • 你可以使用Any而不是创建包含所有实体列表。
  • 你没有确定fullowing state值之一,如果先前的发现

代码:

int state = 0; 

if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Deleted)) 
{ 
    state = 3; 
} 
else if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Modified)) 
{ 
    state = 2; 
} 
else if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added)) 
{ 
    state = 1; 
} 
0

如果您使用实体框架6,你可以override SaveChanges()

public override int SaveChanges() 
{ 
    var addedEntites= ChangeTracker.Entries<IfYouWantSpecifyAnyType>() 
         .Where(p => p.State == EntityState.Added) 
         .Select(p => p.Entity); 

    var modified= ChangeTracker.Entries<IfYouWantSpecifyAnyType>() 
         .Where(p => p.State == EntityState.Modified) 
         .Select(p => p.Entity); 

    var now = DateTime.UtcNow; 

    foreach (var added in addedEntites) 
    { 
    added.CreatedAt = now; 
    added.LastModifiedAt = now; 
    } 

    foreach (var modified in modified) 
    { 
    modified.LastModifiedAt = now; 
    } 

    return base.SaveChanges(); 
} 

它会有@Matthias Burger建议的性能影响,也是我的uld建议使用一个触发器或一些将保留在数据库端的东西。

相关问题