2016-04-25 21 views
4

當模型被實體框架加載時,我想將某些東西注入到模型中。將實體框架注入到模型中

考慮以下用戶模型。我希望實體框架在執行context.Users.Where(somequery)時執行,將SomeReference注入每個從數據庫加載的用戶。

public class User { 

    public string Username {get; set;} 

    public User(SomeReference ref) 
    { 
    } 

} 

我在哪裏可以註冊?

回答

2

你可以嘗試添加這樣的事情在你DbContext構造

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
(sender, args) => 
    { 
    var user = args.Entity as User; 
    if (user != null) 
     user.SomeReference = ref; 
    }; 

我想那麼下一步將是依賴於某種工廠爲可變ref

+0

檢索各種價值觀完美的作品滿足我的需求 –

1

實體框架只能在從DB獲取項目時使用無參數構造函數,所以恐怕這是不可能的,至少不是直接的。我會做的是使默認的構造函數私有,並創建一個新的構造函數,這需要UserSomeReference

再經過
public class User 
{ 
    private User() {} 
    public User(User user, SomeReference ref) 
    { 
     ... 
    } 
} 

的數據獲取從數據庫中,您可以在Select使用此構造函數:

var result = db.Users.AsEnumerable().Select(u => new User(u, myRef)).ToList(); 

注意AsEnumerable()調用,因爲你會得到一個錯誤有關的構造,因爲它不能被轉換爲SQL。請請記住,使默認構造函數私人disables proxy creation,所以你將無法使用延遲加載/自動更改跟蹤了。如果你需要它,你必須公開構造函數。