正在更新模型Linq到实体中未包含的表字段

本文关键字:包含 字段 实体 更新 模型 Linq | 更新日期: 2023-09-27 18:01:51

所以,我想把它命名为"审计与实体的联系"或类似的,但我意识到这并不能完全概括我想做的事情。简单地说,我们的数据建模器需要在应用程序中的每个表上放置4列,甚至包括交叉引用表(表示多对多关系中间的表)

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

编辑

仔细思考这个问题,我意识到我的例子不太完整…想象用户<——>角色关系以及它是如何运作的。您通常创建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支持这个,但是实体框架不支持,我很乐意说服当权者允许我们在实体框架上使用NHibernate,因为我有一个合理的理由。

正在更新模型Linq到实体中未包含的表字段

我有一个非常相似的结构。更新字段的唯一方法是将它们作为属性添加到对象中(我将它们封装在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; }
}