当模型加载实体框架时,我想在模型中注入一些东西。
考虑以下用户模型。我希望实体框架在进行context.Users.Where(somequery)执行时,将SomeReference注入每个从数据库加载的用户。
public class User {
public string Username {get; set;}
public User(SomeReference ref)
{
}
}
我可以在哪里注册?
答案 0 :(得分:2)
您可以尝试在DbContext
构造函数
((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
(sender, args) =>
{
var user = args.Entity as User;
if (user != null)
user.SomeReference = ref;
};
我想下一步就是依靠某种工厂来检索变量ref
的各种值
答案 1 :(得分:1)
实体框架只能在从DB中获取项目时使用无参数构造函数,所以我担心这是不可能的,至少不是直接的。我要做的是将默认构造函数设为私有,并创建一个新的构造函数,该构造函数需要User
和SomeReference
:
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,这样您就无法再使用延迟加载/自动更改跟踪了。如果您需要它,您必须公开构造函数。