C# 将模型Linq中未包含的表字段更新为实体
所以,我想把它叫做“审计Linq到实体”或类似的东西,但我意识到这并不能完全概括我想要做的事情。简单地说,我们的数据建模师需要在应用程序中的每个表上放置4列,甚至是交叉引用表(表示多对多关系中间的表) 无论如何,我已经读了很多关于变更跟踪的文章,这些文章接近我想要做的,但并不确切。我希望做的是覆盖TSQL生成,以附加我需要更新的、不包含在模型中的列 编辑 仔细思考这个问题,我意识到我的例子并不完整。。。想象一下用户角色关系及其工作原理。通常创建3个表:[Users]、[Roles]和[UserRoles],其中有两列用于将多个用户引用到多个角色 现在,想象一下,对于这三个表,您喜爱的DBA添加了4列:CreatedBy、CreatedOn、UpdatedBy、UpdatedOn 在代码中,您可能有一个针对每个用户的角色集合(列表、集合、堆栈等),如下C#代码所示:C# 将模型Linq中未包含的表字段更新为实体,c#,entity-framework,nhibernate,audit,C#,Entity Framework,Nhibernate,Audit,所以,我想把它叫做“审计Linq到实体”或类似的东西,但我意识到这并不能完全概括我想要做的事情。简单地说,我们的数据建模师需要在应用程序中的每个表上放置4列,甚至是交叉引用表(表示多对多关系中间的表) 无论如何,我已经读了很多关于变更跟踪的文章,这些文章接近我想要做的,但并不确切。我希望做的是覆盖TSQL生成,以附加我需要更新的、不包含在模型中的列 编辑 仔细思考这个问题,我意识到我的例子并不完整。。。想象一下用户角色关系及其工作原理。通常创建3个表:[Users]、[Roles]和[UserR
公共类用户
{
公共int Id{get;set;}
公共字符串用户名{get;set;}
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串密码{get;set;}
公共列表角色{get;set;}
}
公共阶级角色
{
公共int Id{get;set;}
公共字符串代码{get;set;}
公共字符串说明{get;set;}
}
是否有人能够成功地更新所有更新和创建的列,而不使用实体框架将这些字段添加到他们的模型中,如果是,他们能否提供这方面的示例
同样的问题,但对NHibernate来说。如果NHibernate会支持这一点,但实体框架不会,我很乐意说服权力允许我们在实体框架之上使用NHibernate,因为我有一个合理的理由。我有一个非常类似的结构。更新字段的唯一方法是将它们作为属性添加到对象中(我将它们封装在AuditInfo类中)或使用触发器。在我的应用程序中向用户显示审核字段,因此我必须将它们作为属性提供。NHibernate是如此的可扩展,以至于你可以完成你的提议,但这将是丑陋的 在我的例子中,触发器是不够的,因为我们的应用程序有自己的用户管理,所以我必须在应用程序中设置xBy属性。我们还准备了触发器作为备份,并记录在应用程序(数据scrubs)之外所做的更改 多对多表带来了一个大问题,因为为了设置审计字段,我必须将它们包括在域模型中。我没有这样做,所以对于那些表,我只有触发器中可用的审计信息(即除了实际用户名以外的所有信息) 试听信息类:
[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; }
}
这是一种方式,但我受到公司政策的限制,我们必须准确地更新4个专栏,即使是多对多,我们和你处于同一条船上。。。我们的应用程序都使用域登录登录到SQL Server,而不是从Active Directory中的每个用户传递WinAuth凭据,因此必须有一种方法来利用应用程序中的“用户”,而不是连接。
public interface IAuditable
{
AuditInfo AuditInfo { get; }
}