Asp.net mvc 在Entity Framework 4.1中将用户名存储到CreatedBy或UpdatedBy DB列

Asp.net mvc 在Entity Framework 4.1中将用户名存储到CreatedBy或UpdatedBy DB列,asp.net-mvc,asp.net-mvc-3,entity-framework,entity-framework-4.1,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,Entity Framework 4.1,我使用的是MVC3、C#、Razor、EF4.1(MSSQL2008(dev)和SQLAzure(Test,Live)) 我想在某些表中添加“CreatedBy”和“UpdatedBy”列,并使用应用程序“principal”用户名作为这些列的值。我正在使用会员服务。我已经使用触发器实现了“CreatedOn”和“UpdatedOn”列。我不能对“CreatedBy”和“UpdatedBy”列执行相同的操作,因为数据库不知道应用程序用户名。您是否可以在MVC应用程序中提供这样做的方法/代码示例,

我使用的是MVC3、C#、Razor、EF4.1(MSSQL2008(dev)和SQLAzure(Test,Live))

我想在某些表中添加“CreatedBy”和“UpdatedBy”列,并使用应用程序“principal”用户名作为这些列的值。我正在使用会员服务。我已经使用触发器实现了“CreatedOn”和“UpdatedOn”列。我不能对“CreatedBy”和“UpdatedBy”列执行相同的操作,因为数据库不知道应用程序用户名。您是否可以在MVC应用程序中提供这样做的方法/代码示例,它不需要我在所有更新实体的地方编写更新代码。我可能正在考虑对“SaveChanges()”进行扩展

我确实意识到这个问题与变更跟踪有关,EF4.1具有内置的审计功能。然而,这是不同的,因为它将所有更改写入审计表,这可能是好的,但在我的情况下,在记录中包含用户名数据也会很有帮助。这一点很有用的一个方面是,当一个人在数据库之间进行数据比较时,他希望避免其他人添加或更新记录。对于纯审计,我很可能在将来添加EF4.1的变更跟踪功能

提前谢谢

编辑:


是否有任何可以插入此代码(如“onSaving”或等效代码)的预事件?为此,请使用
ObjectContext.SavingChanges
Event。 处理正在保存的实体

context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
并设置
CreatedBy
UpdatedBy
列值

如果正在使用
DbContext
,请使用以下代码从中检索
ObjectContext

var adapter = (IObjectContextAdapter)dbContext;
var objectContext = adapter.ObjectContext;

谢谢你。非常有用。是否有一种方法可以识别正在保存的实体,因为这种自定义逻辑可能只适用于某些表,或者更好地测试某些属性的存在性,即“UpdatedBy”,如果存在,更新它。使用
上下文中添加和修改的实体信息。ObjectStateManager
…您的实体类声明为
部分
,对吗?我将使用您的4个成员创建一个自定义接口
IEntityWithChangeHistory
:CreatedBy,UpdatedBy…然后为您的实体创建一个部分实现,指定它们实现该接口(实体必须具有这些属性,对吗?)。现在,您可以检查从
context.ObjectStateManager.GetObjectStateEntries(EntityState.added | EntityState.modified)
添加/修改的实体是否属于
EntityWithChangeHistory
类型。感谢您的帮助,非常感谢。顺便说一句,如果您使用t4模板生成实体类,您可以调整模板,将
ientitywhithchangehistory
添加到需要的实体签名中。