【问题标题】:How to store Active Directory user GUID using Entity Framework?如何使用实体框架存储 Active Directory 用户 GUID?
【发布时间】:2014-08-16 17:16:11
【问题描述】:

我有一个使用 Active Directory 进行身份验证的站点。我正在使用实体框架,我需要存储对此用户的引用。我不想在数据库中保存 AD 用户。一种方法是将用户 guid 作为字符串存储在实体中。

class Entity
{
   String UserGUID ;
}

有没有可能是这样的:

class Entity
{
   UserPrincipal user;
}

不是传递字符串 GUID,而是传递一个对象并使实体框架在某种程度上将关联视为 UserPrincipal 对象是一个实体。它不必是 UserPrincipal 类,它可以是另一个类。我想处理对象而不是字符串。查询活动目录不是问题。

总而言之,我希望能够通过将字符串 GUID 存储在数据库中但将其作为对象加载来将实体与非实体类相关联。

[更新]

许多类可能与 AD 用户有多个关联,并且可能会有所不同,因此基类不是解决方案。例如,我可能有一个这样的类:

class Message
{
   public User Sender;
   public User Recipient;

   public List<User> MentionedUsers;
}

这不是我正在使用的课程,但它说明了我的观点。理想情况下,用户 guid 将存储在消息实体表中,但作为用户加载,就像实体框架对其他实体所做的那样。

我正在考虑将 User 创建为 GUID 的包装实体类并使用静态方法检索属性,但我想避免这种情况。

【问题讨论】:

  • 您是先使用代码还是先使用数据库?首先使用代码很容易做到这一点,但不确定首先使用数据库。编辑:实际上,在数据库中也应该可以。
  • 我先使用代码。新数据库。
  • 请告诉我,为什么要将Guid 存储为string 而不是Guid? (msdn.microsoft.com/en-us/library/system.guid(v=vs.110).aspx)
  • @Mitch 这是一个有效的问题,但它几乎不会影响 Daniel 上面提出的问题。
  • 如果您希望它像上面示例中所示的那样工作,您唯一的选择是分叉和修改实体框架 - 它只是不符合您的要求。下面是一个简单的解决方法,在您使用这些类时将不可见。我将在下面添加一个处理用户列表的方法示例。

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


【解决方案1】:

对于代码来说似乎很容易:

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 是开源的,如果它是一个足够大的项目,对你来说值得,就分叉它并开始。

【讨论】:

  • 这可以工作,但是会有很多这样的实体,所以这意味着我必须将这段代码添加到每个类中。我更喜欢模拟实体框架所做的事情的方法:在数据库中存储一个 id,但返回与该 id 关联的对象。有什么建议吗?
  • 我能想到的两个选项:fork Entity Framework 或在另一个类中具有此功能并让您的类扩展此功能。如果您不止一次使用它,我还会将上述GetUser 函数设为UserPrincipal(或其他东西)的静态成员,将UserGUID 作为参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
相关资源
最近更新 更多