我有一个使用Active Directory进行身份验证的站点。我正在使用实体框架,我需要存储对这些用户的引用。我不想在数据库中保存AD用户。一种方法是将用户guid存储为实体中的String。
class Entity
{
String UserGUID ;
}
是否可以这样:
class Entity
{
UserPrincipal user;
}
而不是传递字符串GUID传递一个对象,并使实体框架稍微处理关联,就像UserPrincipal对象是一个实体一样。它不必是UserPrincipal类,它可能是另一个类。我想处理对象而不是字符串。查询Active Directory不是问题。
总之,我希望能够通过在数据库中存储String GUID但将其作为对象加载来将实体与非实体类相关联。
[UPDATE]
许多类可能与AD用户有多个关联,并且可能会有所不同,因此基类不是解决方案。例如,我可能有这样一个类:
class Message
{
public User Sender;
public User Recipient;
public List<User> MentionedUsers;
}
这不是我正在使用的课程,但它说明了我的观点。理想情况下,用户guid将存储在Message实体表中,但可以像实体框架一样以其他方式加载为用户。
我在想创建User作为GUID的包装器实体类,并使用静态方法检索属性,但我想避免这种情况。
答案 0 :(得分:2)
首先看起来很容易代码:
public class Entity {
public string UserGUID { get; set; }
[NotMapped]
private UserPrincipal? _user;
[NotMapped]
public UserPrincipal User
{
get
{
if (!_user.HasValue)
_user = UserPrincipal.GetUser(this.UserGUID); // Make this static for easier re-use.
return _user.Value;
}
set
{
UserGUID = value.UserGUID;
_user = value;
}
}
}
[NotMapped]
是你的朋友(System.ComponentModel.DataAnnotations
中的朋友)。您可以通过每次使用get
时返回函数调用来简化操作,例如:get { return this.GetUser(); }
并删除_user
字段,但这会影响性能。
我也不确定你是否需要[NotMapped]
字段(在这种情况下为_user
),我会尝试使用和不使用。
有关用户列表:
public class Entity {
public List<string> UserGUIDs { get; set; }
[NotMapped]
private List<UserPrincipal> _users;
[NotMapped]
public List<UserPrincipal> Users
{
get
{
if (_users != null)
_users = UserPrincipal.GetUsers(this.UserGUIDs);
return _users;
}
set
{
this.UserGUIDs = value.Select(u => u.UserGUID).ToList();
_users = value;
}
}
}
不幸的是,用EF实现这一点并不是更优雅的方法。现在,改变EF来做这件事并不是那么困难。 EF是开源的,如果它是一个足够值得你的项目,它就可以开始使用它。