此答案假定使用 Entity Framework 6 Code First 方法(尽管所有代码都应适用于早期版本的 EF)。
我在访问 Provider 和 ProviderUserId 时也遇到了问题。我试图删除通过 OAuth 进行身份验证的用户帐户。我能够使用以下代码从数据库中删除实际的用户帐户:
((SimpleMembershipProvider)Membership.Provider).DeleteAccount(selectedUser); // deletes record from webpages_Membership table
((SimpleMembershipProvider)Membership.Provider).DeleteUser(selectedUser, true); // deletes record from UserProfile table
但是,这留下了 pages_OAuthMembership 表中的条目(我想删除它!)。
为了解决这个问题,我创建了一个与 db 表同名的类:
public class webpages_OAuthMembership
{
[Key, Column(Order=0)]
public string Provider { get; set; }
[Key, Column(Order = 1)]
public string ProviderUserId { get; set; }
public int UserId { get; set; }
}
Key 和 Column 数据注释让 EF 知道 Provider 和 ProviderUserId 形成一个复合键(我认为 SQL Server 将其称为集群 PK)。无论如何,在初始化数据库的 DbContext 类中,我对该类做了一个 DbSet:
public DbSet<webpages_OAuthMembership> webpages_OAuthMembership { get; set; }
这现在允许您在代码中访问数据库中的 OAuth 表
var db = new DbContext(); db.webpages_OAuthMembership.ToList();
// this would give you all entries in the OAuth table
对于您的情况,要获取 ProviderUserId,您可以使用以下代码
var OAuthAccount = db.webpages_OAuthMembership.Where(u => u.UserId == userIdOfUserYouAreSearchingFor).FirstOrDefault;
// ProviderUserId would be OAuthAccount.ProviderUserId
其中 'userIdOfUserYouAreSearchingFor' 是 UserId(来自 UserProfile 表)。确保最后有 FirstOrDefault。这样,如果数据库中没有该特定 UserId 的条目,它将收到 null 并且您可以再次检查。
现在就我而言,我想从所述表中删除条目。以防万一其他人遇到此问题,我也会包含该信息。我用了这段代码
var OAuthAcct = ((SimpleMembershipProvider)Membership.Provider).GetAccountsForUser(selectedUser).ToList();
var provider = OAuthAcct[0].Provider;
var providerUserId = OAuthAcct[0].ProviderUserId;
((SimpleMembershipProvider)Membership.Provider).DeleteOAuthAccount(provider, providerUserId);
从 pages_OAuthMembership 表中删除条目。
希望有帮助!