0

因此,我想将其称为“审计 Linq to Entities”或类似名称,但意识到这并不能完全概括我想要做的事情。简而言之,我们的数据建模器需要在我们的应用程序中的每个表上放置 4 列,甚至是我们的交叉引用表(代表多对多关系中间的表)

无论如何,我已经阅读了大量关于更改跟踪的文章,这与我想要做的很接近,但并不准确。我要做的是覆盖 TSQL 生成以附加我需要更新的未包含在模型中的列。

编辑

更多地考虑这个问题,我意识到我的例子并不完整......想象一下 User <---> Roles 关系以及它是如何工作的。您通常会创建 3 个表:[Users]、[Roles] 和 [UserRoles],其中有 2 列用于将许多用户引用到许多角色。

现在,想象一下,对于所有三个表,您喜爱的 DBA 添加了 4 列:CreatedBy、CreatedOn、UpdatedBy、UpdatedOn。

在代码中,您可能有一个针对每个用户的角色集合(列表、集合、堆栈等),如以下 C# 代码所示:

public class User
{
    public int Id { get; set;}
    public string Username { get; set;}
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Password { get; set; }
    public List<Role> Roles { get; set; }
}

public class Role
{
    public int Id {get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
}

有没有人能够成功地更新所有更新和创建的列,而无需使用实体框架将这些字段添加到他们的模型中,如果是这样,他们能否提供这方面的示例?

同样的问题,但对于 NHibernate。如果 NHibernate 将支持这一点,但 Entity Framework 不支持,我很乐意说服权力允许我们使用 NHibernate 而不是 Entity Framework,因为我有一个正当的理由。

4

1 回答 1

0

我有一个非常相似的结构。更新字段的唯一方法是将它们作为属性添加到对象(我将它们封装在 AuditInfo 类中)或使用触发器。用户会在我的应用程序中显示审核字段,因此无论如何我都必须将它们作为属性提供。NHibernate 是如此可扩展,以至于您可以完成您的建议,但它会很丑陋。

在我的情况下,触发器是不够的,因为我们的应用程序有自己的用户管理,所以我必须在应用程序中设置 xBy 属性。我们还将触发器作为备份并记录在应用程序之外所做的更改(数据清理)。

多对多表存在一个大问题,因为我必须将它们包含在域模型中才能设置审计字段。我不这样做,所以对于那些表,我只有触发器中可用的审计信息(即除了实际用户名之外的所有内容)。

审计信息类:

[Serializable]
public sealed class AuditInfo
{
    public AuditInfo()
    {
        SetCreated(string.Empty, DateTime.Now);
    }

    public string CreatedBy { get; private set; }
    public DateTime CreatedDate { get; private set; }
    public string RevisedBy { get; private set; }
    public DateTime RevisedDate { get; private set; }

    public string CreatedInfo
    {
        get { return "Created: " + CreatedDate.ToShortDateString() + " by " + CreatedBy; }
    }

    public string RevisedInfo
    {
        get { return "Revised: " + RevisedDate.ToShortDateString() + " by " + RevisedBy; }
    }

    internal void SetCreated(string createdBy, DateTime createdDate)
    {
        CreatedBy = createdBy;
        CreatedDate = createdDate;
        SetRevised(createdBy, createdDate);
    }

    internal void SetRevised(string revisedBy, DateTime revisedDate)
    {
        RevisedBy = revisedBy;
        RevisedDate = revisedDate;
    }
}

可审计实体实现的接口:

public interface IAuditable
{
    AuditInfo AuditInfo { get; }
}
于 2013-03-01T20:29:58.657 回答