首先在Entity Framework 6代码中跟踪工作

时间:2015-11-24 10:12:03

标签: c# entity-framework ef-migrations

我想实现一个程序并记录所有事件(插入,更新,删除) 并将它们保存在我的数据库中。

我使用EF codefirst,ASP.NET MVC。

这是我的代码:

public interface IUnitOfWork
{
    int SaveAllChanges();    
    IDbSet<TEntity> Set<TEntity>() where TEntity : class;
}

我的背景是:

public class cmsContext : DbContext, IUnitOfWork
{
    public int SaveAllChanges()
    {
        #region Tracker
        var changeInfo = this.ChangeTracker.Entries()
                             .Where(t => t.State == EntityState.Modified)
                             .Select(t => new
                                         {
                                             Original = t.OriginalValues.PropertyNames.ToDictionary(pn => pn, pn => t.OriginalValues[pn]),
                                             Current = t.CurrentValues.PropertyNames.ToDictionary(pn => pn, pn => t.CurrentValues[pn]),
                                         }).ToList();
        #endregion

        return base.SaveChanges();
    }
}

changeInfo始终为0。有什么问题?

我的服务代码和单位工作是这样的:

public AddArticleCategoryStatus Add(ArticleCategory articleCategory)
{
    _articleCategories.Add(articleCategory);     // IdbSet        
    return AddArticleCategoryStatus.AddArticleCategorySuccessfull;
}

在控制器中我的代码是:

_articleCategoryService.Add(Category);
_uow.SaveAllChanges();

我想记录所有更改并按值插入所有更改。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

在这一行:

_articleCategories.Add(articleCategory);  

您正在添加实体,而不是修改它。因此,EntityState将是Added,而不是Modified。因此,它不会通过您的Where过滤器:

.Where(t => t.State == EntityState.Modified)

答案 1 :(得分:2)

.Where(t => t.State == EntityState.Added || t.State == EntityState.Deleted || t.State == EntityState.Modified)

请注意,您可能需要修改.Select,因为AddedDeleted实体将分别没有原始值和当前值。