2016-04-25 7 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

Entity Frameworkは、DBからアイテムをフェッチするときにのみ、パラメータのないコンストラクタを使用できるため、少なくともこれは不可能ではないでしょうか。データがデータベースからフェッチされた後、あなたはSelectでこのコンストラクタを使用することができます次に

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

:私は何だろうと、デフォルトコンストラクタをプライベートに、そしてUserSomeReferenceをとる新しいコンストラクタを作成することです:それはSQLに変換することができないので、あなたがコンストラクタに関するエラーになるだろうので

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

AsEnumerable()コールに注意してください。 を実行するデフォルトのコンストラクタをプライベートdisables proxy creationにすると、遅延読み込み/自動変更のトラッキングを使用できなくなることに注意してください。必要な場合は、コンストラクターをパブリックにする必要があります。

関連する問題