![](/img/trans.png)
[英]Entity Framework 6 Database First - How to share connection and transaction with ADO
[英]How to deal with database transaction tracking with Entity Framework
對於我正在開發的ASP.NET MVC應用程序,我的實體將與已存在的表相對應,這些表具有旨在跟蹤數據庫事務的列(LastModDate,LastModByUserId,CreateDate,CreateByUserId),但未設置其觸發器擁有以自動填充這些列。 我有點不適應,因為過去我只使用那些通過數據庫觸發器填充這些列或手動完成事務跟蹤但在單獨的表中的表(通常是在處理表時見過的表) ESB和訂購系統)。
我對為什么要以這種方式設置這些列的假設是,在對用戶進行身份驗證但通過應用程序用戶帳戶完成Web應用程序與數據庫的連接的情況下,覆蓋與用戶身份有關的字段。
所以我的問題是在設計映射到這些表的模型時,我是否只是在進行任何修改之前擴展“ DBEntity”類型類並調用“ Update / Updated”例程? 此外,使用這些類型的手動填充的交易列是否常見? 謝謝。
public class DBEntity
{
//Primary Key
public int Id { get; set; }
public DateTime LastModDate {get; set;}
public int LastModByUserId {get; set;}
public DateTime CreateDate {get; set;}
public int CreateByUserId {get; set;}
public DBEntity(UserLogin currentUser)
{
CreatedDate=DateTime.Now;
CreatedByUserId=currentUser.Id;
Updated (UserLogin);
}
public void Updated (UserLogin user)
{
LastModDate =DateTime.Now;
LastModUserId =user.Id;
}
}
public class UserLogin : DBEntity
{
public string Name { get; set; }
public string UserName { get; set; }
public string UserPassword { get; set; }
}
您可以將屬性設置方法設置為保護/私有,並在MVC與html幫助器之間進行類似的操作。
因此,您最終將得到以下結果:
someEntity.Update( x => x.Property, propertyValue, user);
如果您感到困惑,我可以發布Update方法聲明。
我不確定這種情況是否常見,但是我當然認為將其作為數據庫觸發器來實現是一個更好的主意。 但是,如果您必須手動執行此操作,我認為這是使流程自動化的最佳方法。
編輯:
干得好
public class DBEntity
{
public short Prop1 { get; protected set; }
public string Prop2 { get; protected set; }
public DBEntity()
{
}
public void Update<T>( Expression<Func<DBEntity, T>> outExpr, T value)
{
if (value != null)
{
var expr = (MemberExpression)outExpr.Body;
var prop = (PropertyInfo)expr.Member;
prop.SetValue(this, value, null);
}
}
}
測試:
static void Main(string[] args)
{
DBEntity e = new DBEntity();
e.Update<string>(x => x.Prop2, "test");
Console.WriteLine(e.Prop2);
}
如果您還有任何問題,請給我評論。 祝好運!
您可以研究重寫DbContext.SaveChanges()
方法以更新您的創建/更新跟蹤字段(如果使用ObjectContext
而不是DbContext
,則ObjectContext
具有SavingChanges
事件)。
您可能想為這些字段創建一個接口,然后在SaveChanges()
使用ChangeTracker
查找添加和修改的實體,如果它們實現了您的接口,則ChangeTracker
轉換和更新屬性。
這個答案有一些類似的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.