2014-06-26 36 views
0

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

class Entity 
{ 
    String UserGUID ; 
} 

是否有可能是这样的:

class Entity 
{ 
    UserPrincipal user; 
} 

而不是传递字符串GUID传递一个对象,使实体框架治疗的关联有所如同它的UserPrincipal对象是一个实体。它不一定是UserPrincipal类,它可以是另一个类。我想处理对象而不是字符串。查询活动目录不是问题。

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

[UPDATE]

许多类可能具有多个关联与AD用户,它可以变化,从而一个基类不是一个解决办法。例如,我可能有这样的班级:

class Message 
{ 
    public User Sender; 
    public User Recipient; 

    public List<User> MentionedUsers; 
} 

这不是我正在使用的班级,但它说明了我的观点。理想情况下,用户guid将存储在消息实体表中,但可以像实体框架与其他实体一样加载为用户。

我想创建User作为GUID的包装实体类,并检索静态方法的属性,但我想避免这种情况。

+0

你首先使用代码或数据库?首先用代码来做这件事很简单,不过首先不确定数据库。编辑:其实,它也应该可能在数据库中。 – Maverick

+0

我先使用代码。新的数据库。 – d0001

+1

祈祷告诉你,为什么要将'Guid'存储为'string'而不是'Guid'? (http://msdn.microsoft.com/en-us/library/system.guid(v=vs.110).aspx) – Mitch

回答

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是开源的,如果它是一个足够大的项目来为你付出代价,那就分手吧。

+0

这可以工作,但会有这样的实体,所以这意味着我必须将这段代码添加到每个类。我更喜欢一种方法来模拟实体框架做什么:在数据库中存储一个id,但返回与id相关联的对象。有什么建议么? – d0001

+1

我可以从头顶看到两个选项:fork Entity Framework或在另一个类中使用此功能,并让您的类扩展此类。如果您不止一次使用它,我还会将上面的'GetUser'函数作为'UserPrincipal'的静态成员(或其他),它将'UserGUID'作为参数。 – Maverick

+0

请参阅更新。谢谢。 – d0001

相关问题