【问题标题】:Entity Framework 4.1 (Code First) audit columnEntity Framework 4.1 (Code First) 审计栏
【发布时间】:2011-06-21 19:40:08
【问题描述】:

我在 ASP.NET MVC 站点上使用 Entity Framework 4.1 和 Code-First 方法

假设我有一个名为 Profile 的实体,它跟踪用户最喜欢的书,我想跟踪用户何时更新他们最喜欢的书。

更新

以下面的类为例,每当 FavoriteBook 属性的值发生变化时,我想将 FavoriteBookLastUpdated 属性设置为当前日期。

public class Profile
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string FavoriteBook { get; set; }
    public DateTime? FavoriteBookLastUpdated { get; set; }
}

现在我只是在调用 DBContext 的 SaveChanges() 方法之前在控制器的 Edit 操作中更新该字段(如果合适的话)。

有没有办法以某种方式将该逻辑放入我的模型中?我不想在数据库端使用触发器。

【问题讨论】:

  • 使用触发器能完成什么?
  • @Per Hornshøj-Schierbeck,使用 SQL UPDATE 触发器,我可以检查 FavoriteBook 列是否即将更改,并在 FavoriteBookLastUpdated 列中标记当前时间。这正是我想做的,但在代码中。

标签: asp.net-mvc entity-framework ef-code-first


【解决方案1】:

如果您不喜欢我认为正确的@Per Hornshøj-Schierbeck 的答案,您可以尝试使用 EF:

public override int SaveChanges() 
{
    foreach (var entry in ChangeTracker.Entries<Profile>())
    {
        if (entry.OriginalValues == null || // I'm not sure what value this have if entity is not loaded
            entry.Entity.FavoritBook != entry.OriginalValues["FavoriteBook"].ToString())
        {
            entry.Entity.FavoriteBookLastUpdated = DateTime.Now;
        }
    }

    return base.SaveChanges();
}

【讨论】:

    【解决方案2】:

    编辑:我阅读了您的评论和新示例 :)

    你不能让你最喜欢的书属性是一个也设置 LastModified 的实际属性吗?我不确定 EF4 是否会接受这一点,但是您可以创建一个公共属性来更改 FavoriteBook,并创建一个仅用于 EF4 的特殊属性。您可能需要将特殊属性设为“InternalsVisibleTo”

    http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.80).aspx

    【讨论】:

    • +1 是的。如果您想在当前更改的同时更改另一个属性,它看起来像是自定义属性设置器完成所有工作的情况。这与 EF 无关。
    • @Ladislav,完美。我应该从一开始就尝试过。这个是我想多了。我为 FavoriteBook 创建了一个自定义公共属性设置器(和获取器),它还更新了 lastupdated 属性。很简单。
    猜你喜欢
    • 2023-04-02
    • 2012-05-15
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2011-12-11
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多