如何使用Entity Framework存储Active Directory用户GUID?

时间:2014-06-26 00:12:40

标签: c# .net entity-framework asp.net-mvc-5

我有一个使用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的包装器实体类,并使用静态方法检索属性,但我想避免这种情况。

1 个答案:

答案 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是开源的,如果它是一个足够值得你的项目,它就可以开始使用它。