当模型加载实体框架时,我想将一些东西注入到模型中。
请考虑以下用户模型。我希望实体框架将SomeReference注入到执行context.Users.Where(somequery)时从数据库加载的每个用户中。
public class User {
public string Username {get; set;}
public User(SomeReference ref)
{
}
}我可以在哪里登记呢?
发布于 2016-04-25 14:27:38
您可以尝试在DbContext构造函数中添加类似的内容
((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
(sender, args) =>
{
var user = args.Entity as User;
if (user != null)
user.SomeReference = ref;
};我想下一步将是依赖于某种工厂来检索变量ref的各种值。
发布于 2016-04-25 12:57:53
实体框架只能在从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。请do记住,将默认构造函数设置为私有禁用代理创建,这样就不能再使用延迟加载/自动更改跟踪了。如果需要,就必须公开构造函数。
https://stackoverflow.com/questions/36840810
复制相似问题