Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架存储Active Directory用户GUID?_C#_.net_Entity Framework_Asp.net Mvc 5 - Fatal编程技术网

C# 如何使用实体框架存储Active Directory用户GUID?

C# 如何使用实体框架存储Active Directory用户GUID?,c#,.net,entity-framework,asp.net-mvc-5,C#,.net,Entity Framework,Asp.net Mvc 5,我有一个使用Active Directory进行身份验证的站点。我正在使用实体框架,我需要存储对该用户的引用。我不想在数据库中保存广告用户。一种方法是将用户guid作为字符串存储在实体中 class Entity { String UserGUID ; } 有没有可能这样做: class Entity { UserPrincipal user; } class Message { public User Sender; public User Recipient;

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

class Entity
{
   String UserGUID ;
}
有没有可能这样做:

class Entity
{
   UserPrincipal user;
}
class Message
{
   public User Sender;
   public User Recipient;

   public List<User> MentionedUsers;
}
与其传递字符串GUID,不如传递一个对象并使实体框架将关联视为UserPrincipal对象是一个实体。它不必是类UserPrincipal,它可以是另一个类。我想处理对象而不是字符串。查询Active directory不是问题

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

[更新]

许多类可能和广告用户有多个关联,并且可能会有所不同,所以基类不是解决方案。例如,我可能有这样一个类:

class Entity
{
   UserPrincipal user;
}
class Message
{
   public User Sender;
   public User Recipient;

   public List<User> MentionedUsers;
}
类消息
{
公共用户发送者;
公共用户接收者;
公开名单;
}
这不是我正在使用的类,但它说明了我的观点。理想情况下,用户guid将存储在消息实体表中,但作为用户加载,就像实体框架对其他实体所做的那样


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

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

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();}
并删除
\u user
字段,但这会影响性能

我也不确定您是否需要在字段上使用
[NotMapped]
(在本例中为
\u 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;
        }
    }
}
公共类实体{
公共列表UserGUIDs{get;set;}
[未映射]
私有列表用户;
[未映射]
公共列表用户
{
得到
{
如果(_users!=null)
_users=UserPrincipal.GetUsers(this.UserGUIDs);
返回用户;
}
设置
{
this.UserGUIDs=value.Select(u=>u.UserGUID.ToList();
_用户=价值;
}
}
}

不幸的是,没有比EF更优雅的方法来实现这一点。现在,改变EF来实现这一点并不难。EF是开源的,如果它是一个足够大的项目,值得你去做,那就去做吧。

你是先使用代码还是先使用数据库?首先使用代码很容易做到这一点,但不确定首先使用数据库。编辑:事实上,它应该在数据库中首先也是可能的。我首先使用的是代码。新建数据库。请问,为什么要将
Guid
存储为
字符串而不是
Guid
?()@Mitch这是一个有效的问题,但它几乎不会影响Daniel在上面提出的问题。如果您希望它像上面的示例中所示那样工作,那么您唯一的选择就是分叉并修改实体框架-它只是做不到您想要的。下面是一个简单的解决方法,当您使用这些类时,它是不可见的。我将在下面添加一个处理用户列表的方法示例。这是可行的,但会有许多类似的实体,这意味着我必须将这段代码添加到每个类中。我更喜欢一种模拟实体框架功能的方法:在数据库中存储一个id,但返回与该id关联的对象。有什么建议吗?我可以从脑海中看到两个选项:fork实体框架或在另一个类中具有此功能,并让您的类扩展此功能。如果您不止一次地使用它,我也会使上面的
GetUser
函数成为
UserPrincipal
(或其他)的静态成员,它将
UserGUID
作为参数。