C# 如何使用实体框架存储Active Directory用户GUID?
我有一个使用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;
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
作为参数。