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