更新未包含在模型Linq to Entities中的表字段

时间:2013-03-01 19:21:06

标签: c# entity-framework nhibernate audit

所以,我想称之为“审计Linq to Entities”或类似内容,但意识到这并不能完全包含我想要做的事情。简单地说,我们的数据建模者需要在我们的应用程序中的每个表上放置4列,甚至我们的交叉引用表(代表多对多关系中间的表)

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

修改

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

现在,想象一下这三张桌子,你爱的DBA增加了4列:CreatedBy,CreatedOn,UpdatedBy,UpdatedOn。

在Code中,您可能拥有针对每个用户的角色集合(列表,集合,堆栈等),如此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; }
}

是否有人成功地更新了所有更新和创建的列,而没有使用Entity Framework将这些字段添加到他们的模型中,如果有,他们是否可以提供此示例?

同样的问题,但对于NHibernate。如果NHibernate会支持这个,但实体框架不支持,我很自然地说服那些允许我们在实体框架上使用NHibernate的权力,因为我有充分的理由。

1 个答案:

答案 0 :(得分:0)

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

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

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

AuditInfo类:

[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; }
}