我写一个asp.net应用mvc4和我使用实体框架5.我的每一个实体的检索OriginalValues有像EnteredBy
,EnteredOn
,LastModifiedBy
和LastModifiedOn
领域。无法在实体框架5
我想通过使用SavingChanges
事件来自动保存它们。下面的代码已经从众多博客放在一起,SO answeres等
public partial class myEntities : DbContext
{
public myEntities()
{
var ctx = ((IObjectContextAdapter)this).ObjectContext;
ctx.SavingChanges += new EventHandler(context_SavingChanges);
}
private void context_SavingChanges(object sender, EventArgs e)
{
ChangeTracker.DetectChanges();
foreach (ObjectStateEntry entry in
((ObjectContext)sender).ObjectStateManager
.GetObjectStateEntries
(EntityState.Added | EntityState.Modified))
{
if (!entry.IsRelationship)
{
CurrentValueRecord entryValues = entry.CurrentValues;
if (entryValues.GetOrdinal("LastModifiedBy") > 0)
{
HttpContext currContext = HttpContext.Current;
string userName = "";
DateTime now = DateTime.Now;
if (currContext.User.Identity.IsAuthenticated)
{
if (currContext.Session["userId"] != null)
{
userName = (string)currContext.Session["userName"];
}
else
{
userName = currContext.User.Identity.Name;
}
}
entryValues.SetString(
entryValues.GetOrdinal("LastModifiedBy"), userName);
entryValues.SetDateTime(
entryValues.GetOrdinal("LastModifiedOn"), now);
if (entry.State == EntityState.Added)
{
entryValues.SetString(
entryValues.GetOrdinal("EnteredBy"), userName);
entryValues.SetDateTime(
entryValues.GetOrdinal("EnteredOn"), now);
}
else
{
string enteredBy =
entry.OriginalValues.GetString(entryValues.GetOrdinal("EnteredBy"));
DateTime enteredOn =
entry.OriginalValues.GetDateTime(entryValues.GetOrdinal("EnteredOn"));
entryValues.SetString(
entryValues.GetOrdinal("EnteredBy"),enteredBy);
entryValues.SetDateTime(
entryValues.GetOrdinal("EnteredOn"), enteredOn);
}
}
}
}
}
}
我的问题是entry.OriginalValues.GetString(entryValues.GetOrdinal("EnteredBy"))
和entry.OriginalValues.GetDateTime(entryValues.GetOrdinal("EnteredOn"))
没有返回原来的值,而是电流值是null
。我测试了实体中的其他字段,并且它们返回了在html表单中输入的当前值。
如何在此处获取原始值?
你如何更新实体?你是从数据库上下文中首先检索它们,然后使用控制器中收到的值更新它的属性? –
我不知道如何回答你的问题。我正在使用脚手架来做到这一点。 – unlimit