【问题标题】:Implicitly set common properties in Entity Framework 6在 Entity Framework 6 中隐式设置公共属性
【发布时间】:2017-02-21 07:36:56
【问题描述】:

我的应用程序正在使用 EF6 数据库优先 方法。数据库中的所有实体都有 2 个公共属性“CreatedDateTime”和“ModifiedDateTime”。

目前,当我执行 SaveChanges() 时,我会根据我是创建新实体还是更新现有实体来明确设置这两个属性。

如果它是一个新实体,则设置两个属性,否则只设置 ModifiedDateTime 属性。

我想知道是否有办法在保存或更新操作时隐式设置这两个属性?

更新 1
我知道我必须重写 Savechanges() 方法,但这里真正的问题是 SaveChanges 需要访问这两个属性。所以我在这里只看到 2 个选项:
1> 使用反射查找实体是否具有这些属性并进行设置。
2> 修改默认的 T4 生成,使其派生所有具有预定义接口的实体。而这个接口将具有这两个属性。 SaveChanges() 方法可以检查实体是否从该接口派生并设置属性。

我绝对不想通过反射来使用选项 1。

在 DB first 方法中是否有任何其他方法或以前有人这样做过?

【问题讨论】:

  • 我正在寻找数据库优先方法而不是代码优先
  • 你也可以在数据库中设置触发器
  • @jao 我认为这需要在所有表上设置触发器。我有近 100 张桌子
  • T4 选项有什么问题?这正是它存在的原因。否则,您可以对现有 Db 使用代码优先。从长远来看,这是最灵活的选择。 EDMX 并不是真正的前进方向。

标签: entity-framework entity-framework-6


【解决方案1】:

采用第二种方法:调整 T4 文件以包含对接口的引用(例如 IChangeTrack):

public interface IChangeTrack
{
    /// <summary>
    /// When has this entry be created
    /// </summary>
    [Required]
    DateTime CreatedDateTime { get; set; }

    /// <summary>
    /// When has this entry been modified
    /// </summary>
    DateTime? ModifiedDateTime { get; set; }
}

现在通过执行以下操作覆盖您的 SaveChanges() 例程:

/// <summary>
/// Enhance save changes to handle system fields.
/// </summary>
/// <returns></returns>
public override int SaveChanges()
{
    HandleChanges();
    int changes = base.SaveChanges();
    return changes;
}

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
    HandleChanges();
    int changes = await base.SaveChangesAsync(cancellationToken);
    return changes;
}


private void HandleChanges()
{
    ChangeTracker.DetectChanges();
    var entries = ChangeTracker.Entries<IChangeTrack>();
    if (entries != null)
    {
        foreach (DbEntityEntry<IChangeTrack> entry in entries)
        {
            switch (entry.State)
            {
                case EntityState.Added:
                    entry.Entity.CreatedDateTime = DateTime.UtcNow
                    break;
                case EntityState.Modified:
                    entry.Entity.ModifiedDateTime = DateTime.UtcNow;
                    break;
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多